例えば「毎日決まった時間にスプレッドシート上の今日の日付と一致した行番号の内容(今日の名言)をメールで自動送信したい」と思った場合にGAS(GoogleAppsScript)で実現する方法です。
スクリプトエディタを起動する
このあたりは、毎度おなじみのGoogleスプレッドシートを準備してツールから「スクリプトエディタ」を起動します。
スクリプトエディタが立ち上がります。
まずはスプレッドシートのデータ読み込み用変数をセットする
このあたりも毎回ですが、まずはスプレッドシートのデータを読み込むための変数を準備します。※SPREADSHEET_IDのところは、開くスプレッドシートのIDをセットします。
const spreadSheet = SpreadsheetApp.openById("SPREADSHEET_ID");
const activeSheet = spreadSheet.getActiveSheet;
const sheetName = '名言';
const dataSheet = spreadSheet.getSheetByName(sheetName);
それぞれの変数はこのような役割の感じです。※変数名は覚えやすい名前に随時改変ください。
- spreadSheet … ファイルを読み込む
- activeSheet … アクティブなシートを読み込む ※無くてもOK
- sheetName … シート名を直接指定して読み込む
- dataSheet … データのあるシートを読み込む ※前の変数とまとめてしまってもOK
データ取得用の変数をセットする
このような感じでデータを取得するための変数を準備します。
let dRange = dataSheet.getDataRange();
let lastRow = dataSheet.getLastRow();
let lastCol = dataSheet.getLastColumn();
let today = Utilities.formatDate( new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
let todayCol;
let getToday;
- dRange … 表のデータを取得するための変数 ※データのRangeが入る。使わないかもしれない。
- lastRow … 最終行の番号を知る ※ループ判定用
- lastCol … 最終列の番号を知る ※使わないかもしれないが列側になった時用
- today … 今日の日時を取得してyyyy/MM/dd形式に変換する
- todayCol… 今日の行番号を取得 ※後で使う
- getToday … 今日の日付を取得する ※後で使う
送信先アドレス 件名 本文用の変数
メール送信用の変数を準備します。
// 送信先アドレス 件名 本文
let toSend = "from.eguchi@gmail.com";
let toSubject;
let toBody;
- toSend … 送信先のメールアドレス
- toSubject … メールの件名用 ※固定でもOKですがひとまず空にしておく
- toBody … メール本文用 ※後で追加する
これで大体の下準備は完了かと思います。グローバル変数にセットしておきます。
function sendMail()
メール送信用の関数をセットします。名前は任意ですが「sendMail」のような感じがシンプルでよいのではと思います。
あとは、下記のような感じでループを作ります。
function sendMail() {
//「今日の行番号」を取得する
for (var i = 1; i <= lastRow; i++ ) {
getToday = dataSheet.getRange(1,i).getValue();
getToday = Utilities.formatDate( getToday, 'Asia/Tokyo', 'yyyy/MM/dd');
if(getToday == today){
todayCol = i;
toSubject = dataSheet.getRange(i,2).getValue();
toBody = dataSheet.getRange(i,3).getValue();
GmailApp.sendEmail(toSend,toSubject,toBody);
}
何をやっているかというと…
- A列(getRange(i,1))が今日の日付(変数:today)と一致した時
- その行番号を取得する
- B列(getRange(i,2))の値を件名(toSubject)
- C列(getRange(i,3))の値を本文にセットする
- メール送信する
- 最終行まで行ってしまったら終了
みたいな流れです。
エラーが起きた時のために、念のためログもセットしておきます。
console.log("todayCol:"+todayCol);
console.log("getToday:"+getToday);
console.log("lastCol:"+lastCol);
console.log("dRange:"+dRange);
console.log("toSend:"+toSend);
console.log("toSubject:"+toSubject);
console.log("toBody:"+toBody);
スクリプトを実行してみる
ひとまずスクリプトを実行します。いつものように「権限を確認」が表示されるのでGoogleアカウントに権限を与えます。
実行してみます。
Exception: The parameters…
Exception: The parameters (String,String,String) don’t match the method signature for Utilities.formatDate.
エラーが表示されました。
don’t match the method signatureと言われます・・・。どうやら、Utilities.formatDateの中がダメなのかな?という感じです。
中を関数で入れたりしているので、全て日付の状態に変更してみます。
ダメでした。
まとめ
ここまでのところで、エラーが表示されてしまいスクリプトの実行が止まってしまいましたが、ここからうまく実行できるように修正を進めていきます。
この続きについてはPART2の記事に書いていますので、ご参考ください😃