【GAS修行⑩】毎朝、Googleカレンダーの一日の予定を、ChatWorkで自動通知。


・GAS熟練者への道。
・先人達のコードの「写経&コピー」の駆使の成果物のまとめ。
・第十弾
第一弾第二弾第三弾第四弾第五弾第六弾第七弾第八弾第九弾はこちら。

経緯

・「十回目。」
・「正真正銘の複製・過去作たらい回しという、二大荒行記事も、早くもこの回数まできてしまう。」
・「不必要なものは作らないという、合理主義の私として、ここらへんで一区切りにしよう。」
・「本当は作れる技術がないのではという、解答既出の自問自答に心を震わせながら、書いていこう。」
→そういうわけで、今回もサンプルアプリと仏サイトを発見。
https://tonari-it.com/gas-calendar/
→「参考(マルコピ)に作ってみるか」
→取り組み開始。

概要

  • 毎朝、本日のGoogleカレンダーの予定をChatWorkに通知してくれる。
    →LINE,Slack,ChatWorkの3つの連携でも、予定見逃しがあれば、私は一度旅に出てみようと思う。

結果

・実際の画面はこちらです。

作成環境

  1. Google App Script
  2. ChatWork API

手順

※Google Apps Script・Chatork APIの設定は第八弾と一緒

Google Apps Scriptの設定

  • Googleドライブからスクリプトエディタを起動。
    ※Googleアカウントを持っていない人は、作成する。
    • Googleドライブを起動
    • 「新規」→ 「その他」→「アプリを追加」の順にクリック。
    • アプリ検索欄に「script」と入力して検索。
    • 検索結果に「Google Apps Script」が表示されるので、そこの「接続」ボタンをクリック
    • 改めて「新規」→ 「その他」の順にクリックしていくと、「Google Apps Script」が表示されているので、クリック。
  • 起動したプロジェクトに名前をつける
    ※プロジェクト名が反映されるわけではないが、自分がわかる名前をつける。
    →保存されたら一旦置いておく。

ChatWork APIの設定

※ChatWork未登録の人は、一人用を開設しよう。(何かと便利。)

  • ChatWork APIのトークンを発行。
    • チャットページ右上のプロフィールアイコンをクリック後、表示される「API設定」をクリック。
    • API Token設定ページで、「パスワード入力」欄に登録した時の、パスワード入力。
    • 表示されるAPI TOKENをメモしておく。

Googleカレンダーの設定

  • GoogleカレンダーIDを取得。
    • Googleカレンダーにアクセス。
      ※使用していない人は、動作確認のため、今日のスケジュールだけでも入れましょう。
    • Googleカレンダーページ内の左側のマイカレンダーメニューの「点3つ」から「設定と共有」をクリック
    • カレンダー設定ページに遷移後、ページ下部にある「カレンダーの統合」欄の「カレンダーID」をメモしておく。
      ※大体初期状態は、カレンダーIDは自分のメールアドレスとなっている。

ライブラリ設定

  • スクリプトエディタに戻り、上部メニューの「リソース」から「ライブラリ」をクリック。
  • 「ライブラリを追加」欄に下記を追加する。
    • M6TcEyniCs1xb3sdXFF_FhI-MNonZQ_sT・・・・「ChatWorkClient」というChatWork純正ライブラリ。
  • 追加後、「バージョン」を最新にして、「デベロッパーモード」をONにして、保存する。


コード

  • スクリプトエディタ内のコードに、下記を記述する。
chatwork-today-calendar.gs
/* 指定のカレンダーの本日の予定をチャットワークに送る */
function todayReport() {
  /* カレンダーID取得 */
  var myCalendarId=CalendarApp.getCalendarById('カレンダーIDを書く。');
  var now = new Date();
  /* カレンダーの本日のイベントを取得 */
  var todayEvents=myCalendarId.getEventsForDay(now);

  /* 送信メッセージ */
  var eventMessage = "[info][title]" + Utilities.formatDate(now, 'JST', 'yyyy/MM/dd') + "の予定[/title]"
  /* 予定無しメッセージ*/  
  var noMsg = ""

  /* イベントの数だけ繰り返し */
  if(todayEvents.length === 0){
    noMsg = Utilities.formatDate(now,"JST","yyyy/MM/dd") + "は、、、\nなんと予定はありません。\nうきうき(*'ω'*)";
    eventMessage = eventMessage + noMsg + '[/info]';
  }
  else{
    for(var i=0;i<todayEvents.length;i++){
      // タイトル
      var eventTitle=todayEvents[i].getTitle();
      // 開始時刻
      var eventStart=timeChange(todayEvents[i].getStartTime());
      // 終了時刻
      var eventEnd=timeChange(todayEvents[i].getEndTime());
      // 送信内容
      eventMessage=eventMessage + eventStart + '' + eventEnd + " " + eventTitle + '\n';
    } 
    eventMessage = eventMessage + '[/info]';
  }

  // メッセージ送信(チャットワークAPI書く。)
  var cwClient = ChatWorkClient.factory({token: 'ChatWork API トークンを書く。'});
  cwClient.sendMessage({
    //ルームID
    room_id:123456,
    body: eventMessage
  });
}
/* 時刻表記変更 */
function timeChange(targetTime){
  return Utilities.formatDate(targetTime, 'JST', 'HH:mm');
}

※以下の項目を自分のものに変えるのを忘れない。
   ・自分のカレンダーID(先程メモしたもの。)
   ・ChatWork APIのアクセストークン(先程メモしたもの。)
   ・通知ルームID(通知したいチャンネルURLのrid123456の数字部分)

  • 自分のコードに書き換えて保存後、「todayReport」関数を実行して、通知確認。
    • スクリプトエディタ内の上部メニューの「関数名」の部分を「todayReport」に変更して、二つ左の「▶」ボタンで実行。
  • 通知確認後、指定の時間にコードを実行してもらうために、トリガーを設定。

    • スクリプトエディタのタブメニューの「編集」→ 「現在のプロジェクトのトリガー」をクリック。
    • トリガーを作成して、下記の画像のように設定。
    • 保存。
  • 完了。

まとめ

・「これで、予定忘却という戦慄の愚行を行うことはないだろう」と、屈託のない表情で満足げにくつろぐ。
・ひとまずこれで一区切りということで、あとは他シリーズの「Orangeごっこ」や新記事にも挑んでみるか。
・これを見てくださるエンジニアの皆様、「まだまだGASで書けるプログラムあるのに」「今のままじゃ、人生半分損してるぞ」という意見等あれば、是非教えていただけると幸いです。

参考