GASでスプレッドシートのグラフを
コードで自動作成する方法
手作業でのグラフ作成をやめ、newChart()(グラフの組み立て役を作るメソッド)で棒・折れ線・円グラフをコードから自動生成し、定期トリガーで最新データに更新する方法を解説します。
Table of Contents
グラフをコードで作るメリット
グラフはマウス操作でも作れます。ですがコードで作ると、データが更新されるたびに同じ体裁のグラフを自動で作り直せます。 月次レポートや定例の共有資料など、「毎回同じ形のグラフを作る」作業をまるごと自動化できるのが最大のメリットです。
体裁が毎回そろう
色・タイトル・軸ラベルをコードで固定するので、担当者や月が変わっても見た目がブレない
最新データに自動更新
トリガーで定期実行すれば、集計を書き換えるだけでグラフが最新の数値に追従する
画像化して配信できる
作ったグラフをPNGに変換し、メールやSlackへ自動で送れる
複数シートに一括適用
支店別・商品別など、同じ形のグラフを一気に量産できる
棒グラフを作る基本コード
グラフ作成はsheet.newChart()から始めます。ここで返るのがEmbeddedChartBuilder(埋め込みグラフの組み立て役)です。データ範囲・種別・位置を指定し、build()でグラフを完成させてinsertChart()でシートに貼り付けます。
function createColumnChart() {
const sheet = SpreadsheetApp.getActive().getSheetByName("月次売上");
// 例: A列に月、B列に売上(A1:B13 = ヘッダー+12か月)
const dataRange = sheet.getRange("A1:B13");
const chart = sheet
.newChart()
.asColumnChart() // 棒グラフとして組み立てる
.addRange(dataRange)
.setPosition(2, 4, 0, 0) // 2行目・D列(4列目)に配置
.setOption("title", "月次売上")
.setOption("width", 600)
.setOption("height", 360)
.build();
sheet.insertChart(chart);
}setPosition(2, 4, 0, 0)は「2行目・4列目(D列)を左上として、そこからX方向0px・Y方向0pxずらして置く」という意味です。 先頭行を見出しにしておくと、その文字が凡例(グラフの色と項目名の対応表)に自動で使われます。
折れ線・円グラフに切り替える
グラフの種類は組み立て役のメソッドで決まります。棒グラフはasColumnChart()、折れ線はasLineChart()、円グラフはasPieChart()を呼ぶだけです。データ範囲や位置の指定はそのまま使い回せます。
// 折れ線グラフ
function createLineChart(sheet, dataRange) {
const chart = sheet
.newChart()
.asLineChart()
.addRange(dataRange)
.setPosition(2, 4, 0, 0)
.setOption("title", "売上の推移")
.build();
sheet.insertChart(chart);
}
// 円グラフ(構成比を見たいとき)
function createPieChart(sheet, dataRange) {
const chart = sheet
.newChart()
.asPieChart()
.addRange(dataRange)
.setPosition(2, 4, 0, 0)
.setOption("title", "カテゴリ別構成比")
.setOption("pieHole", 0.4) // 中央に穴を開けてドーナツ型に
.build();
sheet.insertChart(chart);
}推移を見せたいなら折れ線、構成比を見せたいなら円グラフが向いています。 目的に合わせて組み立て役のメソッドを差し替えるだけで、同じデータから違う見せ方のグラフを作れます。
タイトル・軸・色を設定する
見た目はsetOption(名前, 値)で細かく指定できます。タイトルや凡例の位置、系列ごとの色、軸ラベル、数値の書式などをまとめて設定できます。
function createStyledChart() {
const sheet = SpreadsheetApp.getActive().getSheetByName("月次売上");
const dataRange = sheet.getRange("A1:C13"); // 月・今年・昨年の3列
const chart = sheet
.newChart()
.asColumnChart()
.addRange(dataRange)
.setPosition(2, 5, 0, 0)
.setOption("title", "今年と昨年の売上比較")
.setOption("titleTextStyle", { fontSize: 16, bold: true })
.setOption("colors", ["#0A0A0A", "#C8C8C8"]) // 系列ごとの色
.setOption("legend", { position: "bottom" })
.setOption("hAxis", { title: "月" })
.setOption("vAxis", { title: "売上(円)", format: "#,###" })
.build();
sheet.insertChart(chart);
}colorsは系列(データの列)の並び順で色が割り当てられます。vAxisのformatに"#,###"を渡すと、縦軸の目盛りが3桁区切りで表示され、金額のグラフが読みやすくなります。
既存グラフを作り直さず更新する
作成関数を何度も実行すると、グラフがどんどん増えてしまいます。これを防ぐには2つの方法があります。 1つはgetCharts()で既存グラフを取得し、removeChart()で消してから作り直す方法。もう1つは既存グラフのmodify()で組み立て直し、updateChart()で上書きする方法です。
function refreshChart() {
const sheet = SpreadsheetApp.getActive().getSheetByName("月次売上");
// 1) 既存グラフをすべて削除してから作り直す(重複防止)
sheet.getCharts().forEach((c) => sheet.removeChart(c));
const chart = sheet
.newChart()
.asColumnChart()
.addRange(sheet.getRange("A1:B13"))
.setPosition(2, 4, 0, 0)
.setOption("title", "月次売上")
.build();
sheet.insertChart(chart);
}
// 位置や種別を保ったまま中身だけ更新したい場合
function updateExistingChart() {
const sheet = SpreadsheetApp.getActive().getSheetByName("月次売上");
const charts = sheet.getCharts();
if (charts.length === 0) return;
const updated = charts[0]
.modify() // 既存グラフから組み立て役を取り出す
.clearRanges()
.addRange(sheet.getRange("A1:B13"))
.build();
sheet.updateChart(updated);
}位置や色などの設定を保ったままデータ範囲だけ差し替えたいときは、後者のmodify()→updateChart()が便利です。行数が毎月変わる集計では、clearRanges()で古い範囲を消してから新しい範囲を足し直すのがポイントです。
グラフを画像化してメールで送る
挿入済みのグラフはgetAs("image/png")でPNG画像のBlob(バイナリデータのかたまり)に変換できます。これをMailApp.sendEmailの添付ファイルに渡せば、グラフ画像をそのままメール配信できます。
function emailChartImage() {
const sheet = SpreadsheetApp.getActive().getSheetByName("月次売上");
const charts = sheet.getCharts();
if (charts.length === 0) return;
// 挿入済みグラフをPNG画像のBlobに変換
const image = charts[0].getAs("image/png").setName("月次売上.png");
MailApp.sendEmail({
to: "report@example.com",
subject: "月次売上グラフ(自動送信)",
body: "今月の売上グラフを添付します。",
attachments: [image],
});
}同じBlobはDriveApp.createFile()でGoogleドライブに保存したり、UrlFetchAppでSlackなどへアップロードしたりもできます。「集計→グラフ更新→画像配信」を一連の流れで自動化できます。
定期実行と実務での注意点
時間主導トリガーを使えば、毎月1日にグラフを最新化してメール送信、といった運用を完全自動化できます。
function createMonthlyTrigger() {
ScriptApp.newTrigger("monthlyChartJob")
.timeBased()
.onMonthDay(1) // 毎月1日
.atHour(8)
.create();
}
function monthlyChartJob() {
refreshChart(); // 最新データでグラフを作り直す
emailChartImage(); // 画像にしてメール送信
}1. データ範囲は集計後に確定させる
グラフを更新する前に、必ず元データの集計を先に済ませておきます。行数が月ごとに変わる場合は、最終行をgetLastRow()で取得して範囲を動的に組み立てると安全です。
2. 画像化は挿入後のグラフに対して行う
getAs()で画像に変換できるのはシートに挿入済みのグラフです。作成直後に画像化したい場合は、insertChart()の後にgetCharts()で取り直してから変換します。
3. 複数シートに量産するときは位置をそろえる
支店別シートなどに同じグラフを作る場合、setPosition()の値をそろえておくと、どのシートでもグラフの位置が一致して見やすくなります。ループで各シートに同じ処理を回すだけです。
まとめ
GASでのグラフ作成は、newChart()で組み立て役を作り、種別・データ範囲・見た目を指定してinsertChart()する、という流れが基本です。既存グラフの更新、画像化してのメール配信、定期トリガーを組み合わせれば、 月次レポートのグラフ作成と共有までまるごと自動化できます。手作業のグラフ更新から解放され、いつでも最新の数値をひと目で共有できるようになります。
よくある質問
シートのnewChart()で取得できるEmbeddedChartBuilder(埋め込みグラフの組み立て役)を使います。addRange()でデータ範囲を、setChartType()でグラフ種別を、setPosition()で貼り付け位置を指定し、build()でグラフを作ってからsheet.insertChart()でシートに挿入します。
setChartType()に渡す値を変えるだけです。棒グラフはCharts.ChartType.COLUMN、折れ線はLINE、円グラフはPIE、横棒はBARを指定します。データ範囲や位置指定のコードはそのまま使い回せるので、種別の定数を差し替えるだけで見た目を変えられます。
sheet.getCharts()で既存グラフを取得し、insertChart()で新規作成する前にsheet.removeChart()で古いグラフを消すと重複を防げます。位置やデータ範囲だけ更新したい場合は、既存グラフのmodify()で組み立て直してsheet.updateChart()で上書きする方法もあります。
送れます。挿入済みグラフはsheet.getCharts()で取得でき、getBlob()やgetAs('image/png')でPNG画像のBlobに変換できます。そのBlobをMailApp.sendEmailの添付ファイルに渡せばメールで送れますし、UrlFetchAppでSlackなどへアップロードすることもできます。
時間主導トリガー(ScriptApp.newTrigger)を使い、毎月1日などに更新関数を実行するよう設定します。集計データを書き換えたあとに既存グラフをupdateChartで作り直せば、人手を介さず最新の数値を反映したグラフを保てます。
GAS開発・業務Webシステムを
相談する。
グラフ付きレポートの自動配信、集計・帳票出力・Gmail通知など、日々の業務を自動化するGAS開発をご相談いただけます。