Google Apps Scriptでグラフをメールに添付して送る【GAS】

地味に自動化で需要が多いのが、グラフ。Google Apps Scriptの場合、データからグラフの作成やそれをメールで送信まで全て自動化が可能です。前の病院でも、日計表を自動集計、役職者に毎朝自動で生成してメールで送るのを作ってました。

tablauやらPower BIやら、Googleデータポータルやら、いわゆるBIツールがなにやら最近出ていますが、正直な所殆どの場合、このGoogle Apps Scriptで自動化のほうが恩恵が大きいと思います。

今回ちょっとこれを昔のフォルダから引っ張り出してきました。

図:こんな感じのグラフを送りつける。

サンプルファイル

メニューに出てくる、🍄 グラフ画像化⇒グラフをメールで送るで、このグラフが自分に届きます。出来れば、データ部分もVisualization API辺りでTableチャート化⇒画像化して送るとGoodかもしれません。

ソースコード

// ドライブに保存
function graphMailman() {
  //スプレッドシートを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('シート1');
  var ui = SpreadsheetApp.getUi();
  
  //グラフをPNG化
  var chart = sheet.getCharts();
  var image = chart[0].getBlob().getAs('image/png').setName('グラフ.png');
  
  //生成先のフォルダを指定
  var folderId = 'ここに生成先フォルダのIDを入れる';

  try {
    //フォルダにグラフ画像を生成する
    var folder = DriveApp.getFolderById(folderId);
    folder.createFile(image);
  } catch (e) {
    //エラーメッセージ
    ui.alert(e.message);
    return;
  }
  
  //メールを送信
  MailApp.sendEmail({
    to: GetUser(),
    subject: 'グラフメールテスト',
    //body: "メールでグラフを送ってみる",  //添付の場合は、attachmentsに配列でつなげると複数添付出来る
    //attachments: [image],
    htmlBody: '<img src="cid:preview"><br/>',  //inlineで送る時はhtmlBodyにこうする
    inlineImages: {
      preview: image,
    }
  });
}

//現在のユーザのアドレスを取得
function GetUser() {
  var objUser = Session.getActiveUser();
  return objUser.getEmail();
}
  • getSheetByNameできちんとシートを指定しましょう。
  • sheet.getChart()はそのシートにあるチャートを全て取得します。配列で取れるので、chart[0]で1個目のチャートという意味になります。
  • getBlobで取得、getAsで画像の形式を指定、setNameで名前をつけます。
  • DriveAppで指定のフォルダにcreateFileで画像をそのまま生成可能です。
  • MailAppではBlob形式のまま、attachmentsにつけるもよし、本文にインラインで表示するもよしです。attachmentの場合には、配列でつなげると複数添付が可能です。
  • インラインの場合、inlineImagesオプションでファイルをくっつけます。この場合、htmlBodyをオプションで利用し、その本文内には、<img src="cid:識別子">を加えます。この識別子は、inlineImagesのオプション内で使ってるpreviewって文字がそれで、複数つけることも可能。自由自在に本文内にグラフを配置できるわけです。
  • 何故か作ったグラフのカスタマイズが解除された状態で添付されるのはどうしてだろう・・・

図:inlineImageの場合は本文内に表示

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)