どうも最近物忘れがひどかったり、期限があるものにギリギリまで着手せず大変な思いをする事が多いです(笑)
なので、GoogleスプレッドシートでTo Doリストを作り、締切日の欄を設け、期限が近くなったら自動でリマインドメールを送れるようにしたいなと思いました。
調べたらドンピシャな情報がありましたm(_ _)m

自分用にスクリプトとやらをチョチョッと修正させてもらい、無事リマインドメールを送れるようになりました。感謝・・・!
ただ、スクリプトに関して全く予備知識なしに始めて色々意味が分からず苦戦したので、備忘録として記事に残しておこうと思います。
To Doリストの準備
私はこんな感じのTo Doを作りました。
共有リクエスト時々いただくのですが、共有はしません。ごめんなさい。
To Doリストにどんどん入力していき、期限を決めて、締め切りが近いのにステータスが「完了」になってないものについてリマインドメールを自動送信したい。
これと全く同じ並びでTo Doリストを作れば、この後シェアするスクリプトをコピペしてアドレス部分を変更するだけで使える・・・と思う。(ただし自己責任で)
スクリプトを書く
スクリプトを書き込めるエディタを開きます。

Apps Scriptという画面が開くので、↓

この赤枠部分を一旦消しちゃって、以下の内容をコピペします。
function mailSend() { var mySs = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートを取得 var Sheet = mySs.getSheetByName('To Do'); // シート名を取得 var today = new Date(); //今日の日付を取得 var strTo = "送信先メールアドレス"; //To var strSender = "リマインダー"; //差出人名 var strFrom = "今ログインしてるGmailアドレス"; //From /* 繰り返し計算 */ for (var i = 1; i <= 200; i++) { var to_do = Sheet.getRange(i, 2).getValue(); //B列 ToDoを取得 var limit = Sheet.getRange(i, 3).getValue(); //C列「期限」を取得 var status = Sheet.getRange(i, 4).getValue(); //D列「ステータス」を取得 var importance = Sheet.getRange(i, 5).getValue(); //E列「重要度」を取得 var time_span = Sheet.getRange(i, 6).getValue(); //F列「推定所要時間」を取得 var detail = Sheet.getRange(i, 8).getValue(); //H列「詳細」を取得 var need = Sheet.getRange(i, 9).getValue(); //I列「必要物・URL等」を取得 var note = Sheet.getRange(i, 10).getValue(); //J列「備考」を取得 var date_limit = new Date(limit); //G列「期限」のDateを作成 var dt = date_limit.getTime() - today.getTime(); //date_limitから今日の日付を引く var day = Math.ceil(dt / 1000 / 60 / 60 / 24); //日付に変換 if (status == "完了") /* ステータスが完了なら何もしない */; else if (5 <= day && day <= 7) { //締め切りの7日~5日前 /* メール本文を準備 */ var strSubject1 = to_do + "の期限まで" + day + "日です"; var strBody1 = to_do + "の作業に取り掛かりましょう。\n" /* 改行 */ + "期限まであと" + day + "日です。\n" /* 改行 */ + "\n" /* 改行 */ + "この作業の推定所要時間は" + time_span + "、重要度は" + importance + "です。\n" /* 改行 */ + "\n" /* 改行 */ + "【詳細】\n" /* 改行 */ + detail + "\n" /* 改行 */ + need + "\n" /* 改行 */ + note + "\n" /* 改行 */ + "\n" /* 改行 */ +"期限:" + date_limit; /* メールを送信 */ var send = GmailApp.sendEmail( strTo, strSubject1, strBody1, { from: strFrom, name: strSender } ); }else if (0 < day && day <= 2) { //締め切りの2日前 /* メール本文を準備 */ var strSubject2 = to_do + "の期限まであと" + day + "日です!"; var strBody2 = to_do + "の作業は順調ですか?\n" /* 改行 */ + "期限まであと" + day + "日です。\n" /* 改行 */ + "\n" /* 改行 */ + "この作業の推定所要時間は" + time_span + "、重要度は" + importance + "です。\n" /* 改行 */ + "\n" /* 改行 */ + "【詳細】\n" /* 改行 */ + detail + "\n" /* 改行 */ + need + "\n" /* 改行 */ + note + "\n" /* 改行 */ + "\n" /* 改行 */ +"期限:" + date_limit; /* メールを送信 */ var send = GmailApp.sendEmail( strTo, strSubject2, strBody2, { from: strFrom, name: strSender } ); }else if (day <= 0) { //締め切り日 /* メール本文を準備 */ var strSubject3 = to_do + "の締切日を過ぎています。"; var strBody3 = to_do + "は締切日を過ぎています。作業は完了しましたか?\n" /* 改行 */ + "\n" /* 改行 */ + "この作業の推定所要時間は" + time_span + "、重要度は" + importance + "です。\n" /* 改行 */ + "\n" /* 改行 */ + "【詳細】\n" /* 改行 */ + detail + "\n" /* 改行 */ + need + "\n" /* 改行 */ + note + "\n" /* 改行 */ + "\n" /* 改行 */ +"期限:" + date_limit; /* メールを送信 */ var send = GmailApp.sendEmail( strTo, strSubject3, strBody3, { from: strFrom, name: strSender } ); } } }
あ、もちろん私にはこんなの書けないです。
冒頭でご紹介した2記事を参考にして、私の場合はこんな感じになりました。
一応、備忘録なので気づいた点。

- 1行目 functionの後の文字列が関数名(?)になる。複数ある場合上のプルダウンで選べそう(試してない)
- 11行目~ やたらと登場する「i」は「変数」でよく使うらしい。なぜ「i」を使うかは気にしなくていい。
- 12行目~ 「var」で「変数」を宣言してる。varの後に続く文字は分かりやすい任意のものでOKっぽい。
var、色んなサイト参考に見てみたけど、よく分からん・・・。仕方ないので、
var importance = Sheet .getRange(i, 5) .getValue();
とりあえずまあ / この単語だしたら / シートの / 5列目のiのセルの / 値を返して
と思うことにした。(プログラマーさんに怒られそう)
基本的にメールに入れたい列をvarであんな感じで書いておけばOKかなと。
リマインダーメールを送るタイミングの設定
忘れっぽいので(笑)、以下の3パターンでメールが届くようにしました。
- 締め切り日の7~5日前
- 2日前~締め切り日前日
- 締め切り日以降
【締め切り7~5日前】
スクリプトはこの部分↓

- varで決めた単語でスプレッドシートの値を引用
- 定型文は””で囲んでメール本文を作成。
- +で単語・文章をつなぐ
改行は「\n」(バックスラッシュと半角小文字nですが、フォントによっては\になる)
これで、締め切り日7~5日前のタイミングでステータスが「完了」になってないTo Doについて、以下のようなメールが送れるようになります。

期限のとこ、米国東部標準時になっちゃって直し方分からないんだけど(笑)
そんなに困らないからまぁいいや。(おい)
【2日前~締め切り日前日】
あまりにメールがたくさん飛んでくるのもしんどいので、少し間をあけて締め切り2日前からまたメールが来ます。
スクリプト↓

メール↓

【締め切り日以降】
スクリプト↓

メール↓

あ、これはあくまでサンプルなので、お中元のタイミングおかしくね?というツッコミは無しで。
スクリプトの権限確認
スクリプトが書けたら、実行ボタンを押すと実行できます。

普通は隣の「デバッグ」ボタンで入力ミスが無いかチェックするのかな。
初めて実行する時、こんなポップが出ます。↓

「権限を確認」ボタンを押してGoogleアカウントを選択します。↓

恐ろしい警告が出ますが、左下の「詳細」ボタンを押すとこんな画面になるので、↓

「無題のプロジェクト(安全ではないページ)に移動」をクリックします。

よく読んで、自己責任で「許可」ボタンを押します。
これでスクリプトを実行できるようになりました。
トリガー(スクリプトの実行タイミング)を設定
チェック用に締め切り日が近いTo Doを何パターンか用意しておいて、無事にスクリプトが動けば「トリガー」の設定をします。
左のメニューから時計マークの「トリガー」をクリック。

初めて使う時、こんなポップが出ますが欄外をクリックして消してOK。

右下の「+トリガーを追加」ボタンをクリック。

こんな画面になるので、↓「イベントのソースを選択」で「時間主軸型」をクリック。

すると「時間ベースのトリガーのタイプを選択」という項目が増えるので、↓

ドロップダウンリストから「日付ベースのタイマー」を選んで、↓

その後「時刻を選択」の項目で好きな時間帯を選んで保存すればOK。
あとでタイミングを変更したい場合は、トリガーリストにカーソルを当てて、右の方に表示される鉛筆マークをクリックで変更できます。

カレンダーやリマインダーアプリが使いにくい人には良いかも
これを作ってウキウキで旦那に報告したところ、
「え・・メールが送れるだけ・・・?カレンダーとかのアプリじゃダメなの?」
と言われた(笑)
うーん確かにそうなんだけどね(;^ω^)でも、カレンダーやリマインダーアプリって結構その場限りっていうか。
私の中で、美容院の予約とかはカレンダーアプリがいいし、シャンプー切れたから買い物行くとかはリマインダーアプリでいいんだけど。
そうじゃなくて、年単位で繰り返しやる作業、数日かけてやる作業、後で振り返りたい作業、一覧でざっと確認したい作業とか・・・。
そいういうものを管理したくて、こういうのを作った次第です。
スプレッドシートのアプリあるので、タスク完了したらスマホからでも入力できるよ。