Google Apps Scriptを使えば自動でリマインダーが送れるよって話

# はじめに
みなさん、リマインダーを送る機会って結構ありますよね。
例えば僕の普段の研究室とかだと、定期的に研究発表や論文報告をしたりするわけです。
そのときに、あなたが今週の担当者ですよーっていうのを送らないと、みんな忙しいので忘れちゃったりするわけです。
もしかしたら会社で働いてる人達はそんなことないのかもしれませんが、まあ多分似たようなことがあると想像します。
そういうときに、下っ端の人とかが「毎週リマインダーを担当者に送ってよ」とか「発表のアブストラクトを貰って全体メーリングリストに流してよ」とか言われたりするわけです。
でも下っ端の人だって忙しいわけで、忘れちゃったりもするし、面倒くせえなあと思うわけです。
もはやリマインダーのリマインダーが欲しくなったりしますよね。
そもそもやることは単純で、毎回担当者に「今週はあなたが担当ですので、忘れずにやって下さい」だの「アブストちゃんと俺に送れよ」って旨のメールを送るだけです。
そういう毎回似たような内容のメールを送信するのってたぶん自動化できるよね？ってのが今回の動機になります。

ここでは自動でメールを配信する方法を紹介します。

# 条件
- G-mail でメールを送る。
(送信するメールアドレスは変更可能)
- メール内容があらかじめ決まっている。

# 準備


1. [Googleスプレットシート](https://www.google.com/intl/ja_jp/sheets/about/)にログイン
「Googleスプレッドシートを使う」をクリック

2. 新規スプレッドシートを作成
3. ``「ツール」>>「スクリプトエディタ」``を選択。
4. 下のコードをコピペ。保存。

参考：https://pasolack.com/tips/gmail-schedule-send/

# コード
説明は省きますが、読んだらある程度分るかと思います。
トリガーの登録には``AutoReminder``を実行します。
すると実行予定時刻にsendMailsが実行されます。
変数``data``に、指定したスプレッドシートの内容が2x2の配列で代入されています。

```js:AutoMailing.gs
function AutoReminder() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1'); //　使用するシートを取得
  var data = sheet.getDataRange().getValues(); // シートからデータを取得
  var time = new Date().getTime(); // 現在時刻を取得
  var res; // 各行の実行結果を保管する変数
  
  for (var row = 1; row < data.length; row++) { // データの行番号を1からdata終了までrowに代入してループ
    
    var schedule = data[row][4];  // i行目の配信時刻をscheduleに代入
    if (schedule == "") break; // schedule が空になったらループ終了
    
    if ( schedule.getTime() > time) { // 予定配信時刻scheduleが現在時刻timeを越していれば、Triggerに処理sendMailsを登録。
      
      ScriptApp.newTrigger("sendMails")
      .timeBased()
      .at(schedule)
      .inTimezone('Asia/Tokyo')
      .create();        
      
      res="Scheduled";
      
    } else { // 予定配信時刻scheduleが過去の場合、何も行わない
      
      res="Date is in the past";
      
    }
    
    sheet.getRange("F"+(row+1)).setValue(res); // 実行結果をF列目に表示
    
  }
}

function sendMails() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');　//　使用するシートを取得
  var data = sheet.getDataRange().getValues();　// シートからデータを取得
  var time = new Date().getTime();　// 関数を時刻した時の時刻を取得
  var mailto, kenmei, honbun, option;　// メール送信に必要な変数達
  
  for (var row = 1; row < data.length; row++) {　// データの行番号を1からdata終了までrowに代入してループ
    
    if (data[row][5] != "Scheduled") continue; // 
    
    var schedule = data[row][4]; // i行目の配信時刻をscheduleに代入
    if (schedule == "") break; // schedule が空になったらループ終了
    
    if (time > schedule.getTime() ) { // 関数実行時刻timeが予定配信時刻scheduleを越していれば、メールを送信する
      
      mailto  = data[row][0]; // 送信先メールアドレス
      kenmei  = data[row][2]; // 件名
      honbun  = data[row][1] + '様、\n\n' + data[row][3]; // 本文。宛名も一応つける。
      option  =  {
        from: 'mr91i <xxxx@yyyyy.com>', // 送信元メールアドレスを設定
        name: 'Auto Reminder System'　// 表示される送信者を設定
      }
      GmailApp.sendEmail(mailto, kenmei, honbun, option); // メールを送信
      sheet.getRange("F" + (row + 1)).setValue("Delivered");// 実行結果をF列目に表示
      
    }
    
  }  
}

function cleanAllTriggers() { // 登録されているTriggersを全て消す
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }
}
```

# シートの設定

シートの設定の例を公開します。

https://docs.google.com/spreadsheets/d/1TkIFiNYGhbOJgCbgAE1Hut9U3E7o9DKyVIHsgBKo7Tg/edit?usp=sharing


こんな感じに設定しておきます。
要は参照されるセルに然るべき情報が書いてあればなんでもいいです。
足りなくなったら増やします。
自分のドライブにコピーしたい際は、Googleアカウントにログインした状態で、`ファイル >> コピーを作成 >> マイドライブ`といった感じに進めばコピーが作成されます。

追記：度々、上記スプレッドシート例のアクセス権の申請をいただくのですが、編集権限は差し上げられません。コピー自体はアクセス権がなくともできると思っているのですが、もし違ったり別の用件がありましたらメッセージください。

# 使い方
``「ツール」>>「スクリプトエディタ」`` しスクリプトエディタ画面で、
``「実行」>>「関数を実行」>>「AutoReminder」``をすると関数が実行され、
現在の"シート1"で配送予定時刻が現在時刻の後になっているものをトリガーに追加します。
配送予定時刻が来るとそのトリガーが実行され、メールが自動で送信されます。

現在の登録されてるトリガーは、
``「編集」>>「現在のプロジェクトのトリガー」``で確認できます。
(順番がバラバラで見づらいかもですが。)



# 感想

Google Apps Scriptを初めて触ってみたのですが、結構自由にいろんなことができる印象でした。
今回のこと以外にも導入してどんどん面倒なことは自動化してゆきたいですね。
コメント、ウェルカムです。

# 追記
担当者から情報をもらうタイプのリマインダーについても、スプレッドシートを公開にしておいて、期日までに発表者にタイトル・アブスト入力してもらえば、「To 発表者：アブスト入力しといて」「To 全体：タイトル・アブストはこれこれです」まで自動化できそうですね。入力してなかったら止める等のエラー処理はある程度必要だとは思いますが。

#

# 参考
今回のことをやるにあたって、以下の記事を参考にしました。

- [アドオンを使わずにGmailを「予約自動送信」する方法](https://pasolack.com/tips/gmail-schedule-send/)
- [GoogleAppsScriptのトリガーを使って自動化をマスターしよう](https://ebijun.work/google-apps-script-trigger/)