見出し画像

GASで毎週のZOOM会議のリマインダを流す

コロナ禍でリモートワークになってから週3回Zoom会議があって、それぞれの前日にリマインダを流している。最初はいちいち前日にメールを打っていたが、すぐにgmailのメールスケジューラを使うようになり、1ヶ月分とか一気にコピペで予約していた。けど、それはそれで面倒だし、つい忘れることもあって…

そんなときこのエントリを見た

なんですとぉ〜!毎日使っているGoogle Driveの奥にそんな統合開発環境が隠れていたとは。しかもGoogle Apps Script(GAS)はローカルなラップトップ閉じていてもクラウドで仕事してくれる、しかも職場のサーバーにcron job走らせたり、それをメンテナンスしたりとか厄介な業務もいらないし、gmailとの親和性もいい。メールリマインダみたいな用途にぴったりじゃん!

画像1

ということで早速リマインダーメーラーを作ってみた。

仕組みを設計する

・Google スプレッドシートに曜日・送信先・文面などの入ったリストを会議ごとに用意する。そうだ、休日などで一時的にメールを止めるためにactive/inactiveを指定できるようにしておこう。
・スクリプトでリストを読み込む。曜日で見て、明日会議があるようならgmailでリマインダを送信
・このスクリプトをGASのトリガー機能で毎日3~4PMに起動する。就業ちょっと前にメールが来るのがきっといいですよね。

会議リストの作成

まずはGoogle スプレッドシートで会議リストの作成。

画像2


1列目 会議がActiveかInactiveか。休日とかの場合はここをいじる。セルの内容が"Active”か"active"のときだけ、リマインダを出す。
2列目 会議の曜日を指定。フルの英語表記(例: Tuesday)、英語省略表記(TueまたはTu)、日本語のフルまたは省略表記(火曜日・火)のいずれでも通るようにする。
3列目 ミーティングの名称とか曜日とか時間とか。これはメールの件名および内容のトップに使う。
4列目 ZOOM会議のリンクURL。メール内容の2番目として使う。
5列目 コメント。メール内容の3番目に付加することがあればここで。
6列目 メールの受信者リスト。gmailが受け入れられる形式であればよい。複数あればカンマ区切り。「ニックネーム <メールアドレス>」の形式もOK。

完成したらスプレッドシートの自体のURLからスプレッドシートのIDを取得しておく。

GASスクリプト作成〜曜日判別部分の関数

まずは会議があるかどうかを判別する関数の作成

function meeting_reminder_mailer() {
  ...
}

以下、中身について
まず、スプレッドシート読取り部。小さいので中身全部valsに落とす。

 var sheet = SpreadsheetApp.openById("YOUR SPREADSHEET ID HERE");
 var sheetName = sheet.getName();
 var rng=sheet.getDataRange();
 var vals=rng.getValues();

先ほどのシートIDをここに入力。Googleで閉じてるからoauth2みたいな認証トークン要らないのも実に良い!ところで、このコードはGASで初めて書いたのでvarとconstとletの使い分けが分かっていなかった。その点はお見逃しくだせぇ。

次に現在時刻の取得。ローカルタイムの文字列が帰ってくる。それを曜日の数字 0 (Sun) ~ 6 (Sat)に変換。配列calendar_dateにはSundayと見なすべき奴ら、Mondayと見なすべき奴ら、...を一緒に記述する。

 var date = new Date();  // today's date
 var todayDate = date.getDay(); // Today's day of the week from 0~6
 var calendar_date = [
   ['Sunday',   'Sun', 'Su', '日', '日曜日'],
   ['Monday',   'Mon', 'Mo', '月', '月曜日'],
   ['Tuesday',  'Tue', 'Tu', '火', '火曜日'],
   ['Wednesday','Wed', 'We', '水', '水曜日'],
   ['Thursday', 'Thu', 'Th', '木', '木曜日'],
   ['Friday',   'Fri', 'Fr', '金', '金曜日'],
   ['Saturday', 'Sat', 'Sa', '土', '土曜日']
 ]

次は会議リストを一個一個みて明日会議があるかチェックする部分。
・その行vals[i]の最初の要素が'Active'か'active'ならactiveを1にそうでなければ-1に。
・その行の曜日指定文字列をmeeting_dateに取り込む。
・for jで日・月・火・水…とループを回して、もしmeeting_date文字列がcalendar_date[j]内に見つかったら(includesがtrueなら)、meeting_date_numに数字で曜日を取り込む。
・だが、今日がその前日かチェックしたいので、meeting_date_numから1を引き、7を足して、7のmodulo (%)を取る事で、ミーティング前日の曜日を非負整数0~6に変換。これをkに入れる。
・今日(todayDate)がkで、かつこの行がactiveなら sendReminder(vals[i])でメーラーを呼び出す。この行の情報は全部sendReminderに渡す。

若干、アルゴリズムとしてダサかったですが、まあこの規模なのでヨシとする。すでに稼働しているのを直してテストするの結構めんどくさいし…

  for (var i = 1; i < vals.length; i++) {

   // The loop for each meeting ....

   var active
   var date_matched

   // Determine if the meeting is Active or Inactive 
   // Accept "Active" and "active
   if (vals[i][0]=='Active' || vals[i][0]=='active') {
     active = 1;
   } else {
     active = -1;
   }

   var meeting_date = vals[i][1]; // meeting date specified in the spreadsheet

   for (var j = 0; j < calendar_date.length; j++) {
     // Loop for each date of the week
     if (calendar_date[j].includes(meeting_date)) {
       var meeting_date_num = j;
       // Determination if the meeting is held tomorrow
       var k=(meeting_date_num-1+7) % 7; // the day before the meeting 0~6

       if (todayDate == k  && active==1) {
         sendReminder(vals[i])
       }

     }
  }

GASスクリプト作成〜メーラー部分の関数

bodyに本文を構築し、GmailApp.sendEmailに全部情報を渡してメールを発信します。

function sendReminder(vals) {
   // vals[0]: active / inactive
   // vals[1]: meeting date of the week
   // vals[2]; Meeting description
   // vals[3]; Zoom Link
   // vals[4]; Comment
   // vals[5]; Recipient
   const recipient = vals[5];
   const subject = vals[2];
   const body = vals[2]+'\n'+vals[3]+'\n'+vals[4]+'\n\n'+'Unamuni'
   const options = {
     from: 'xxx@xxx.xxx.xxx',
     name: 'Unamuni San',
     cc: 'xxx@xxx.xxx.xxx', 
     replyTo: 'xxx@xxx.xxx.xxx'};
 
   GmailApp.sendEmail(recipient, subject, body, options);
 }

スクリプトのテスト

この時点で、コードが動くか確認。Gシートで、とりあえず本物の会議の情報は全部inactiveにしておいて、ダミーの自分宛の会議のみactiveに残しておき、それを明日の曜日に設定。スクリプトを走らせてエラーがないか、メールが来るか確認します。

→よっしゃー、メール来たー。じゃあ次にこれを定期的にスケジュールするように設定します。

トリガーの設定

Apps Scriptの左側の時計アイコンからトリガー(関数の自動起動)を選択。画面右下の青い「Add Trigger」ボタンからトリガーを作成。

画像3

トリガーには関数meeting_reminder_mailerを選択。デプロイはHeadで。イベントはTime-driven、毎日1回3pm~4pmに設定します。トリガーのテストをするなら、毎分とか適当にアレンジして試験してください。

画像4

これで完成!
#効率化 #仕事効率化 #作業効率化  #業務自動化 #自動化
#メール #GMAIL #電子メール
#ZOOM  #ZOOM会議 #リマインダ #会議リマインダ
#GAS #GoogleAppsScript

いいなと思ったら応援しよう!