山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

Google Apps ScriptでGoogleスプレッドシートの内容をメールする

概要

会社のメールがGoogle Appsになったので、スプレッドシートやらGoogleドライブと色々連携を試しています。
で、連携をするために使用するのがGoogle Apps Script(略称GAS)ですが、殆どJavaScriptなので超簡単!
とりあえず、スプレッドシートで作った簡易的な進捗管理をメールで送信するようなGASを作成してみました。
実際にはGASは定期的に実行する機能もあるので、毎日朝8~9時に送信するようにしています。

仕様

No. やること 担当 進捗 期日 備考
1 あれをやる 田中 ちょっとだけ 2015/04/25 がんばる
2 これをやる 鈴木 完了 2015/03/25 すぐやる
3 それをやる 高橋 半分くらい 2015/04/15 そのうち
  • 送信されるメール

f:id:yamap_55:20150323022454j:plain

スプレッドシート及びGASのサンプル

※このGASはスプレッドシートに紐付いてないので、動きません。(SpreadsheetApp.getActiveSpreadsheet()がnull)

コード

var MAIL_ADDRESS = "example@example.com";
function myFunction() {
    var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
    var sheet = ss.getSheetByName("進捗一覧"); // シートの名前
    
    // 進捗が100%以外のタスクのIndexを取得
    var index = getHeadIndex(sheet, "進捗");
    var range = sheet.getRange("a1");
    var items = [];
    for(i=0;i<sheet.getLastRow();i++) {
      if(range.offset(i, index).getValue() != "完了") {
        items.push(i);
      }
    }
    var style = " style='border:1px #000000 solid;border-collapse:collapse;'";
    var tableList = [];
    tableList.push("<p>タスク一覧</p>");
    
    //データを取得し、HTMLのテーブルを作成。
    tableList.push("<table" + style + ">");
    for(i=0;i<items.length;i++) {
      // iは行のIndex
      var study = [];
      for(j=0;j<sheet.getLastColumn();j++) {
        // jは列のIndex
        var value = range.offset(items[i], j).getValue();
        
        if(Object.prototype.toString.call(value) == "[object Date]") {
          value = formatDate(value);
        } else {
          value = value.toString().replace("\n", "<br/>");
        }
        study.push(value);
      }
      tableList.push("<tr" + style + "><td" + style + ">" + study.join("</td><td" + style + ">") + "</td></tr>");
    }
    tableList.push("</table>");
    
    GmailApp.sendEmail(MAIL_ADDRESS, "進捗連絡", "body", {htmlBody : tableList.join("\n")});
}

/**
 * 指定された名前のHeadを検索し、Indexを返す
 */
var getHeadIndex = function(sheet, name) {
  var range = sheet.getRange("a1");
  for(i=0;i<sheet.getLastColumn();i++) {
    if(range.offset(0, i).getValue() == name) {
      return i;
    }
  }
};

// DateをYYYY/MM/DD形式に変換する
var formatDate = function(date) {
  var format = 'YYYY/MM/DD';
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, ('0' + (date.getMonth() +1)).slice(-2));
  format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
  return format;
};

まとめ

上のコードはテーブルで表示させているのでやたら長くなっていますが、データ取得するだけ、メール送るだけなら簡単!
Gmailメインの人はプライベートでも色々使っていけるのかも。

参考


追記(2016/12/22)

単純にメールすればどうすれば良いの?っとコメントいただいたのでシンプルなものを追記します。
各メソッドなどは公式リファレンスを参照してください。

仕様

スプレッドシート

No. やること 担当
1 あれをやる 田中
2 これをやる 鈴木
3 それをやる 高橋

送信されるメール

f:id:yamap_55:20161222124541j:plain

コード

var MAIL_ADDRESS = "example@example.com";

function myFunction() {
  var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
  var sheet = ss.getSheetByName("進捗"); // シートの名前
  var lastRowIndex = sheet.getLastRow();
  
  var range = sheet.getRange(2, 1, lastRowIndex - 1, 3);
  var values = range.getValues();
  
  var bodyList = values.map(function(value, index) {
    return ("No : " + value[0] + "\nやること : " + value[1] + "\n担当 : " + value[2]);
  });
  GmailApp.sendEmail(MAIL_ADDRESS, "進捗連絡", bodyList.join("\n"));
}