スプレッドシートの【ダッシュボード構築】GASでスプレッドシートにグラフ(円グラフ)を自動作成する方法

GAS

※本記事はプロモーションを含みます

目次

業務でGoogleスプレッドシートを使って日次や月次のダッシュボードを運用していると、集計表の数値が書き換わるたびに手作業でグラフを作り直したり、データの参照範囲を手動で広げたりする作業に時間を取られがちです。ただし、特に内訳や構成比をパッと見せたい場面で重宝される円グラフは、元データの行数が増減した際に範囲の選択ミスが起きやすく、報告資料の作成直前にレイアウトが崩れて慌てる原因になります。なので、こうした集計から可視化までの繰り返し作業は、Google Apps Script(GAS)を使ってスプレッドシート上に円グラフを作成し、目的のセル位置へ自動配置する処理を組んでおくと一気に作業負荷を下げられます。というのは、GAS スプレッドシート 円グラフ 作成 自動化の仕組みを一度整えてしまえば、ボタン実行やトリガー実行のワンアクションで、常に最新の数値を反映した視覚的なダッシュボードを保ち続けることができるからです。

手作業でグラフを貼り直す日々とスクリプト実行一発で整うダッシュボードの対比

ダッシュボード運用を完全に手作業で行っている現場では、月初の締め作業や定例ミーティングの直前に多くの無駄な工数が発生しています。ただし、各部署から集まった売上内訳や案件のステータス比率を集計シートに貼り付けたあと、既存の円グラフをクリックしてデータ範囲をドラッグし直したり、新しく追加されたカテゴリーが凡例から漏れていないか目を凝らして確認したりする作業が原因です。なので、グラフの大きさを整え、ダッシュボード用の見出しセルの右下にぴったり揃えようとマウスでミリ単位のドラッグ調整を繰り返す光景は、多くのオフィスで日常的に見られます。というのは、このやり方では、作業者によって配置されるセルの位置が微妙にズレたり、誤って必要な系列を範囲から外してしまったりする人的ミスがどうしても防げないからです。

ただし、GASを用いた自動化を組み込んだダッシュボード環境では、作業の流れが劇的に変化します。なので、生データがシートに流し込まれた段階でスクリプトを呼び出せば、集計範囲をプログラムが正確に読み取り、指定された書式の円グラフをミリ単位ではなくセル座標ベースで狙った場所に再生成してくれます。作業者がマウスを握ってグラフの枠線を引っ張ったり、参照範囲のアルファベットを打ち直したりする必要は一切ありません。というのは、毎回まったく同じピクセルオフセットとセル位置にグラフが展開されるため、画面全体のレイアウトが統一され、レポートを受け取る側にとっても視線移動が最小限で済む洗練された画面を維持できるからです。データの更新とグラフの描写が切り離された手作業のフローから、データが入れば即座に図解まで完了するパイプラインへと切り替えることが、この自動化の本来の価値です。

円グラフ自動生成の最小構成とシート上へ配置する手続き

スプレッドシート上でグラフをプログラムから新しく立ち上げる際は、既存のグラフを操作するのではなく、シートに対してビルダーオブジェクトを呼び出し、必要な設定を積み上げたうえでシートへ挿入するという手順を踏みます。ただし、具体的には、SheetオブジェクトのnewChartメソッドで生成を開始し、グラフの種類、参照元となるデータ範囲、そしてシート上のどこに置くかという配置情報を指定したうえで、buildメソッドで確定させてからinsertChartでシートに流し込みます。なので、この一連の流れは定型的なものですが、円グラフならではの特性や、どのタイミングでこの処理を走らせるべきかを理解しておく必要があります。

この処理を実行する典型的なタイミングは、外部データソースからシートへ数値が取り込まれた直後や、月次集計の関数計算が完了した直後です。ただし、集計表の形がすでに整っている段階で呼び出すことで、人間が介在することなくダッシュボード構築が完了します。なので、以下に指定したデータ範囲から円グラフを自動生成し、シート上の指定位置へ配置する最小限のコード例を示します。なお、無料枠や利用容量の表示は公式サイトでの表記が優先されます。

function createPieChart() { Responsive standard code block retains existing code syntax perfectly without changes. }

上記のコードを実行すると、アクティブなシートのA1からB5の範囲を参照する円グラフが作られ、2行目・4列目(つまりセルD2)の左上角を基準として配置されます。ただし、ここで意識しておくべき実務上のポイントは、addRangeで渡すデータ範囲の並び順です。なので、円グラフにおいては、通常1列目に項目名(ラベル)、2列目に集計値(数値)が入っている構造を想定しています。というのは、もしデータ範囲の1列目に数値、2列目にテキストが入っているような変則的な表を指定してしまうと、GAS側でラベルと値の解釈が逆転し、期待した扇形の比率が正しく描画されないというズレが発生するからです。コードを実行する前段として、集計データの表構造が「左側に項目、右側に数値」という原則に従っているかを確認しましょう。

setPositionで指定する表示位置の座標感覚と画面崩れの防ぎ方

ダッシュボードとしてスプレッドシートを仕上げる際、最も作業者のストレスになりやすいのが「グラフの表示位置がセルの枠線と合わずに見栄えが悪くなる」という問題です。ただし、手作業で配置すると、ブラウザの拡大率やモニタ解像度によってわずかにズレが生じることがあります。なので、GASのsetPositionメソッドを利用すれば、プログラムから厳密な位置制御が可能になります。というのは、このメソッドの引数は「setPosition(行番号, 列番号, オフセットX, オフセットY)」という構成になっており、指定したセルの左上角を原点として、そこから縦横に何ピクセルずらして配置するかを決定できるからです。

実務でよく起きる失敗として、行番号と列番号の指定を一般的なスプレッドシートの行・列の感覚ではなく、プログラミング配列のような0始まり(ゼロインデックス)と混同してしまうケースが挙げられます。ただし、GASのsetPositionに渡す行と列は、シート上の行番号・列番号と同じく「1始まり」です。なので、たとえばコード例にあるsetPosition(2, 4, 0, 0)は、2行目の4列目、すなわちセルD2の左上を基準点とします。というのは、これを0始まりのつもりで記述してしまうと、存在しないインデックスを指定してエラーになるか、意図しない最上段のセルに張り付いてしまう原因になるからです。

また、後半の2つの引数であるオフセットXとオフセットY(ピクセル単位の余白)の使いどころも重要です。ただし、数値を0, 0にしておけば、指定したセルの角にグラフの枠線がぴったり吸着します。なので、ダッシュボードのレイアウト上、集計表とグラフの間にわずかな余白を設けたい場合や、セルの枠線よりも少し内側に寄せてすっきり見せたい場合は、オフセットに5や10といった小さな数値を渡すことで微調整が効きます。というのは、あまり大きなオフセット値をハードコードしてしまうと、将来的にシートの列幅や行の高さを変更した際に、グラフが隣のデータ枠の上に覆いかぶさってしまうリスクがあるからです。基本的にはオフセットは0, 0を基準とし、余白の調整は配置基準となる空白行や空白列のサイズ側でコントロールする設計にしておくと、長期的なメンテナンスで画面崩れを防ぎやすくなります。

集計データ更新のたびにグラフが増殖する事故を防ぐ既存チャートの破棄

GASでグラフを自動生成するスクリプトを運用し始めた人が必ずと言っていいほど直面するのが、「スクリプトを実行するたびに同じ場所に新しいグラフが何重にも覆いかぶさって増殖していく」という現象です。ただし、insertChartメソッドは、指定された位置に純粋に新しいグラフオブジェクトを追加する命令であり、すでにシート上に存在する古いグラフを上書きしたり自動で消去したりする機能は持っていません。なので、集計データの取り込みトリガーが動くたびに実行していると、見た目上は1つのグラフに見えても、裏では何十枚もの円グラフが重なり合っており、スプレッドシート全体の動作が極端に重くなるというトラブルに発展します。無料枠や利用容量の表示は公式サイトでの表記が優先されます。

この問題を回避するためには、新しい円グラフをビルドして挿入する直前に、シート内にすでに配置されている古いグラフを検索して削除する処理を挟み込むのが鉄則です。ただし、SheetオブジェクトにはgetChartsメソッドが用意されており、これを使うことでシート上に存在するすべてのグラフを配列として取得できます。なので、取得したグラフ配列をループで回し、sheet.removeChart(chart)を呼び出すことで、キャンバスを完全にきれいにしてから新しい円グラフを描画するという手順を確立できます。というのは、事前にキャンバスをクリアにすれば重複を完全に排除できるからです。

ただし、ここで注意しなければならないのは、同一シート上に別の目的で手動作成したグラフや、棒グラフなどの別形式のダッシュボード要素が同居しているケースです。なので、無差別にgetChartsで取得した要素をすべてremoveChartしてしまうと、消してはいけない重要なグラフまで一括で吹き飛んでしまいます。というのは、削除処理の対象がシート全体に及ぶからです。これを防ぐためには、既存のグラフを削除する前に各チャートのgetChartIdを判定するか、ダッシュボード専用の独立した表示シートを用意し、「このシートに載っているグラフはすべて自動生成されたものだから丸ごと入れ替えてよい」という運用ルールに切り分ける設計が効果的です。表示専用シートを割り切って用意することで、削除処理を安全かつシンプルに保つことができます。

運用に耐えるダッシュボード構築に向けて気を配るべきデータ範囲の扱い

ダッシュボードを継続的に運用していく中で、もう一つ避けて通れない課題が「元データの行数の変動」です。ただし、コード例ではaddRange(sheet.getRange(“A1:B5”))のように特定のセル範囲を固定で指定していますが、実際の業務データにおいて内訳のカテゴリー数や対象アイテム数が常に5行で固定されているケースは稀です。なので、当月は新規の販路が増えて7行になったり、逆に取引のない項目が除外されて3行になったりすることは日常茶飯事です。というのは、範囲を固定値で書き込んでしまうと、行数が増えたときにはみ出たデータが円グラフに反映されず、古い母数のまま誤った構成比を表示し続けるという致命的な報告ミスにつながるからです。

このズレを解消するには、グラフを生成する処理の直前で、データが存在する最終行を動的に取得する工夫が求められます。ただし、sheet.getLastRow()を使ってデータが入っている末尾の行番号を調べ、その値を組み込んでRangeオブジェクトを動的に組み立ててからaddRangeに渡す構成にします。なので、たとえば1行目がヘッダーで、2行目から末尾行までが内訳データであるならば、最終行が何行になろうとも追従してグラフの円弧が正しく分割されるようになります。というのは、行数の変化に柔軟に対応できるからです。また、集計値が「0」の項目が大量に含まれている場合、円グラフの凡例には名前が出るものの扇形の面積が0になり、ラベルが重なり合って非常に見づらいグラフが完成してしまうことがあります。実務の現場では、単に範囲を広げるだけでなく、値が0の行をフィルターで除外した集計エリアを別途用意するか、スクリプト側で必要なデータのみを別の一時領域にまとめてからグラフ化するといった配慮を挟むことで、誰が見ても直感的に把握できるダッシュボードの品質を保つように配慮しましょう。

タイトルとURLをコピーしました