予定がいっぱいあると、忘れてしまいがちなので、事前に通知してくれるアプリが欲しいと思っていました。
なので、以前C#で予定を登録して、自動でメール送信するアプリを作りました。
ただ、このアプリの難点は、PCを常に起動しておかないとメール送信が起動しないことです。(パソコンのタスクスケジューラでメール送信をするからです…)
サーバを借りるのも面倒だなと思い、GoogleSpreadSheetとGoogleAppsScriptで対応してみました。
メール送信アプリの内容
時間指定でメール送信をする設定は、Googleのサーバ内に登録するので自分のPCが起動していなくても、実行が可能になります。
こんな感じで予定を入れておきます。
メールを送信する時間を設定しておくと、こんな感じでメールが送信されてきます。
使い方
GoogleSpreadSheetをコピー
以下からSpreadSheetを開きます。
https://docs.google.com/spreadsheets/d/1rULHw4MEEfl6GZiwNdjPgr7S4ZYGQTNEqoAp5jHtUVk/edit?usp=sharing
閲覧専用なので、コピーして保存をしてください。
「ファイル」→「コピーを作成」の順で保存できます。
これで、編集ができるようになります。
予定を記入する(イベントシート)
イベントシートに予定、時間などを記入していってください。
各設定を記入する(設定シート)
設定シートに各設定を記入します。
各列の説明については、D列の備考・説明に記載してある通りです。
メール送信時間は、通知時間は1日2回だけ設定可能です。
メール送信のトリガーをセットする
設定シートの記入した「通知時間1」と「通知時間2」の時間にメール送信を起動させるためには、トリガーの設定をします。
時間指定で起動するトリガーをセット
①「拡張機能」→「Apps Script」をクリックします。
②左端にマウスを移動して、「トリガー」をクリック
③「トリガーを追加」→設定を入れて保存
関数は「setTriggers」です。
時間は「午前0時~1時」にしておいて下さい。
初回のみトリガー保存時は認証が出るかもしれないので、認証しておいて下さい。
「不要トリガー削除」のトリガーをセット
一日に何回もトリガーを実行すると、ごみのトリガーが溜まっていきます。
GoogleSpreadSheetが重くなる可能性があるので、自動で削除する設定をします。
設定方法は送信の設定とほとんど同じです。
関数は「delTrigger」
時間は「午後11時~午前0時」にしておいて下さい。
件名・本文(メールフォーマットシート)
件名、本文、署名は「メールフォーマットシート」から変更できます。
「設定シート」の「事前通知日数」を変更すると自動で反映されます。
メール送信の仕様・注意
●「作業シート」は処理に使うので、削除しないでください
●「イベントシート」の対象が「〇」になっているいベンドだけメールの送信がされます。
●「イベントシート」イベント名が入力されていないとメール送信対象になりません。
●送信対象は999行目までなので、定期的に削除しておいてください。
●日付順に並んで送信されます。
ソースコード(GAS)を一部紹介
キレイなソースではありませんので、ご容赦ください…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
//==============================================' //目的 :メール送信処理 //引数 : //戻り値 : //==============================================' function sendEmails() { var sheetEvents; //イベントシート格納 var sheetEventsData; //イベントシートのデータ格納 var sheetReceiverGroup; //宛先グループシート格納 var sheetWork //作業用シート var sheetWorkData //作業用シートデータ var sheetMainSettings //設定シート var sheetMailFormat //メールフォーマットシート var dtNow; //現在時刻を取得 var advanceNoticeDays; //事前通知日数 var ToAddr; //Toアドレス var CcAddr; //Ccアドレス var BccAddr; //Bccアドレス var subject; //件名 var body; //本文 var signature; //署名 var workEventNameColNum; //ワークシートのイベント名列番号 var workDateColNum; //ワークシートの日付列番号 var workEventPlaceColNum; //ワークシートの場所列番号 var workEventNoteColNum; //ワークシートの内容列番号 //▼▼▼▼▼メイン設定シートからのデータを取得▼▼▼▼▼ // シートの取得 sheetMainSettings = SpreadsheetApp.getActive().getSheetByName('設定'); //名前定義から値を取得 advanceNoticeDays = sheetMainSettings.getRange("事前通知日数").getValue(); //To、CC取得 ToAddr = sheetMainSettings.getRange("Toアドレス").getValue(); CcAddr = sheetMainSettings.getRange("Ccアドレス").getValue(); //▲▲▲▲▲設定シートからのデータを取得▲▲▲▲▲ //▼▼▼▼▼イベントシートからのデータを取得▼▼▼▼▼ //イベントシートの取得 sheetEvents = SpreadsheetApp.getActive().getSheetByName('イベント'); //イベントシートをアクティベート SpreadsheetApp.setActiveSheet(sheetEvents) // シートのデータを取得(2次元配列) sheetEventsData = sheetEvents.getSheetValues(3, 1, sheetEvents.getLastRow(), sheetEvents.getLastColumn()); //▲▲▲▲▲イベントシートからのデータを取得▲▲▲▲▲ //▼▼▼▼▼作業シートをクリア▼▼▼▼▼ //作業シートを取得 sheetWork = SpreadsheetApp.getActive().getSheetByName('作業シート'); //作業シートをクリア ClearSheet('作業シート'); //▲▲▲▲▲作業シートをクリア▲▲▲▲▲ //▼▼▼▼▼宛先グループごとにイベントシートからイベントを取得する▼▼▼▼▼ //イベントシートをアクティベート SpreadsheetApp.setActiveSheet(sheetEvents); //イベントシート上で条件に使う列のアルファベットを取得 var eventSendTargetCol = ColumnNoToLetter(getColNum("対象",2,1,2,sheetEvents.getLastColumn())); var eventNameCol = ColumnNoToLetter(getColNum("イベント名",2,1,2,sheetEvents.getLastColumn())); var eventDateCol = ColumnNoToLetter(getColNum("日付",2,1,2,sheetEvents.getLastColumn())); //現在時刻を取得 dtNow = new Date(); //日付の抽出条件を[現在日] + [設定で指定した日付]にセット var dtSearchTo = dtNow.setDate(dtNow.getDate()+advanceNoticeDays); dtSearchTo = Utilities.formatDate(dtNow,"JST","yyyy-MM-dd"); //条件日付の変換 dtSearchFrom = new Date(); var dtSearchFrom = Utilities.formatDate(dtSearchFrom,"JST","yyyy-MM-dd"); //作業シートに対象宛先グループのデータを出力 //■条件 //送信対象:〇 //イベント名:NOT NULL //日付:現在日 <= 日付 <= 現在日-パラメータ var v = sheetWork.getRange("A1").setFormula ("=QUERY('イベント'!2:999,\"SELECT * WHERE "+eventSendTargetCol+" = '〇' AND "+eventNameCol+" IS NOT NULL AND "+eventDateCol+" >= date '"+dtSearchFrom+"'\ AND "+eventDateCol+" <= date '"+dtSearchTo+"' order by "+eventDateCol+" asc\",true)").getValues(); //出力したイベントデータを取得 //作業シートをアクティベート SpreadsheetApp.setActiveSheet(sheetWork); // シートのデータを取得(2次元配列) var sheetWorkData = sheetWork.getSheetValues(2, 1, sheetWork.getLastRow(), sheetWork.getLastColumn()); //▲▲▲▲▲宛先グループごとにイベントシートからイベントを取得する▲▲▲▲▲ //▼▼▼▼▼メール本文を作成する▼▼▼▼▼ //イベントシート上で条件に使う列のアルファベットを取得 workEventNameColNum = getColNum("イベント名",1,1,1,sheetWork.getLastColumn()); workDateColNum = getColNum("日付",1,1,1,sheetWork.getLastColumn()); workEventPlaceColNum = getColNum("場所",1,1,1,sheetWork.getLastColumn()); workEventNoteColNum = getColNum("内容",1,1,1,sheetWork.getLastColumn()); // シートの取得 sheetMailFormat = SpreadsheetApp.getActive().getSheetByName('メールフォーマット'); //名前定義から文言を取得 subject = sheetMailFormat.getRange("件名").getValue(); body = sheetMailFormat.getRange("本文").getValue(); signature = sheetMailFormat.getRange("署名").getValue(); //イベントデータからメール本文を作成 sheetWorkData.forEach(function(value,item) { //イベント名が空白時はスキップ if(value[workEventNameColNum-1]!="") { body = body + "◆" + value[workEventNameColNum-1] + String.fromCharCode(10) + "【日付】" + Utilities.formatDate(value[workDateColNum-1],"JST","yyyy-MM-dd") + String.fromCharCode(10) + "【場所】" + value[workEventPlaceColNum-1] + String.fromCharCode(10) + "【内容】" + value[workEventNoteColNum-1] + String.fromCharCode(10)+ String.fromCharCode(10); } }); body = body + signature; //▲▲▲▲▲メール本文を作成する▲▲▲▲▲ options = { cc:CcAddr, bcc:BccAddr, name:'予定自動送信Gmail', noReply: true, }; //メール送信 GmailApp.sendEmail(ToAddr, subject, body,options); } |
全体解説
流れとしては以下のようになっています。
①送信対象のイベントを取得
②取得したイベントを文章に成形する
③メールを送信する
送信対象のイベントを取得(86行目~)
86行目で、送信する日付に一致したイベントを取得しています。
本当は不要だったのですが、「作業シート」に対象のイベントを表示するようにしています。
Query関数でSQLのようにデータを取得しています。
そして、イベントを「sheetWorkData」変数に格納しています。
取得したイベントを文章に成形する(113行目~)
スプレッドシートの1行を「日付 + 改行 + 場所 + 改行 + 内容」に整形していきます。
ここは対象のイベント件数分ループして本文を作成しています。
124行目でフッターの文言をセットしています。
メールを送信する(127行目~)
オプションの中にCC、差出人の表示名、返信可否をセットしています。
そして、135行目で本文、件名をセットしてメール送信を行っています。