傘はあまり差したくない人

思ったことを書きたいだけの場所

【GAS】「当日の退社時の予定をLINEから入力してグーグルカレンダーに登録する」くん作った

ちょっとした予定というのは、ちょっとしているだけにすぐ忘れるので作った。

Google App Scriptと、LINEのmessaginAPIというやつでなるべく簡単に。

 

雨の日に傘忘れないでくんの紹介はしたが、本当に作りたかったのはこっち。ということでさっさと作る。

 

先人たちのおかげで大して詰まることはなかった。ありがたい~。

 

要件

LINEに

「買い物

トイレットペーパー

サランラップ

と送ると、Googleカレンダーに「買い物」というタイトルで説明のところに「トイレットペーパー、サランラップ」という予定が退社時間(18時)に追加されるようにする。

 

できれば、退社時(18時)と帰宅時(19時)どちらの予定にするか選びたい。「買い物」は退社時、「洗濯」は帰宅時に通知してほしいから。

 

可能な限り楽に作りたい。可能な限り楽に予定登録をしたい。

 

コードを書く

というわけでまずコードを書く。

カレンダーに予定を追加する方法は「傘忘れないでねくん」で覚えたので、LINEとの連携についてちょっと調べる。

要はLINEからメッセージを受け取って、その内容を読み取る必要があるのだ。

 

はい、以下がとても参考になりました。ありがとうございます。

 

ebijun.work

 

以下、コード。

 

//LINEからPOSTメソッドでメッセージが送られてきたらleaveOfficePlanを呼び出す
function doPost(e) {
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if(event.type == "message"){
      if(event.message.type=="text"){
        //文字の部分だけを抽出しleaveOfficePlanを実行する。
        leaveOfficePlan(event.message.text);
      }
    }
  });
}

function leaveOfficePlan(message) {
  var calendar = CalendarApp.getDefaultCalendar();
  
  var today = new Date();
  if(message.split(/\r\n|\n/)[0] == "いえ" || message.split(/\r\n|\n/)[0] == "家"){
    
    // 帰宅時の予定
    var plans = message.split(/\r\n|\n/);
    
    // 二番目に書いてある予定をタイトルにする
    var title = plans[1];
    var startStr = Utilities.formatDate( today, 'Asia/Tokyo', 'yyyy/MM/dd')+" 19:00:00";
    var endStr = Utilities.formatDate( today, 'Asia/Tokyo', 'yyyy/MM/dd')+" 20:00:00";
    var detail = "";
    
    // 「いえ」とタイトル以外を説明文に追加
    for(var i = 2;i < plans.length; i++){
        detail += plans[i];
      detail += "\n";
    }
    var option = {
      description: detail
    }
  }else{
    // 退社時の予定
    // 一番目に書いてあるテキストを予定のタイトルにする
    var title = message.split(/\r\n|\n/)[0];
    var startStr = Utilities.formatDate( today, 'Asia/Tokyo', 'yyyy/MM/dd')+" 18:00:00";
    var endStr = Utilities.formatDate( today, 'Asia/Tokyo', 'yyyy/MM/dd')+" 19:00:00";
    var option = {
      description: message
    }
  }
  
  var endDate = new Date(endStr);
  var startDate = new Date(startStr);
  calendar.createEvent(title, startDate, endDate, option);
}

 

己の楽さを追求した結果散漫なコードになりますた。最適化するのも面倒だったんで。

何回Utilities.formatDate( today, 'Asia/Tokyo', 'yyyy/MM/dd')を書くんだ。ファンキーだな。

 

上のメソッドはLINEからメッセージを受け取ったら動くもの。特に中身を変える必要はない。

 

カスタマイズするなら下のメソッド。

 

退社時(18時)と帰宅時(19時)で分けたかったので以下の条件をつける。

 

if(message.split(/\r\n|\n/)[0] == "いえ" || message.split(/\r\n|\n/)[0] == "家")

 

LINEに送るメッセージが

「いえ

洗濯」

 

であれば19時に予定をいれる。「家」でも可。ものぐさ人間なので律儀に「帰宅時」とか入れるのすらめんどくさい。「いえ」が限界。

 

もし最初の行が「いえ」もしくは「家」でなければ問答無用で18時に予定を入れる。このあたりはユーザー(私)がしっかりすればよい。

 

予定のタイトルは「いえ」の場合は2行目、そうじゃなければ1行目を入れている。

予定の説明については「いえ」の場合は3行目以降。そうじゃなければ問答無用でタイトル含めて全部入れている。めんどくさかったので。さすがに「いえ」の場合だと「いえ」とタイトルが説明に入ってきて邪魔なので除外するようにしたが(// 「いえ」とタイトル以外を説明文に追加のあとのfor文当たりの処理)。

 

もしもっと汎用性の高いものを作りたければ、

LINEにて

「20200205 12:30

買い物

トイレットペーパー

サランラップ

と送り、一行目を取得してそのままstartStrとかにぶっこめばいいと思う。終了時間はプラス一時間とかにして。そうすれば予定の日時もLINEで入力できる。

 

ただ私はものぐさ人間なので「20200205 12:30」と打ち込むのすら嫌。「かいもの」とだけ打って終わらせたい。のでこういう仕様に。

 

コードができあがったら、保存して上のメニューから「公開」「ウェブアプリケーションとして導入」を選ぶ。

 

f:id:y-a-d:20200131114000p:plain

 

「Execute the app as:」は「自分」、もしくは「me」。

 

「Who has access to the app:」は「全ユーザー(匿名も含む)」、もしくは「Anyone,even anonymous」。

 

承認を求められた際に警告が出たら、「詳細」からの「○○(安全ではないページに移動)」からの「許可」でいける。

 

そしたらできあがったURLをコピってどこかにはっつけとく。

 

ちなみに、コードを変更した場合は、ProjectVesionをnewにしないと反映されないので注意。

 

LINE DevelopersでmessagingAPIを取得

はい、次はLINEと連携できるようにします。

またまた下記を参照すればOK。ありがたい~~。

 

ebijun.work

 

私のコードはLINEのメッセージをGASに送るだけのためページ中盤の「LINEからGoogleAppsScriptにメッセージを送る」の項目だけでOK。

 

ただ、私の場合はLINE Developersのページが完全に英語だった。それでも参考URLとほとんど変わらないので大丈夫なはず。結構な頻度で仕様が変わるっぽい。

注意点だけ書いときます(2020年1月時点)。

 

messaginAPIを登録する時に「プラン」を選ぶ項目がなかった。そのまま進めば勝手に「フリー」になっているため大丈夫。

 

設定時は「messagingAPI」項目の「Webhook settings」を編集。「Webhook URL」に先ほどコピったGASのURLをはっつけて更新。

近くのボタンが「Verify」となっているので押下してテスト。「Success」と出ればOK。200がどうたらとエラーが出たら「ウェブアプリケーションとして導入」の手順が違っている可能性がある。特に「Who has access to the app:」は「全ユーザー(匿名も含む)」、もしくは「Anyone,even anonymous」になっているかを確認。

 

「Use webhook」をONにする。

 

参照URLの

Botグループトーク参加」を「利用する」

は「Allow bot to join group chats」のことだと思う。

「Edit」のページから
「チャット」「チャットへの参加」の項目を探し、
「グループ・複数人チャットへの参加を許可しない」から「グループ・複数人チャットへの参加を許可する」に変更する。

恐らく「Allow bot to join group chats」は「Disabed」のままだが、そのうち「Enabled」になると思うので気にしない。

 

はい、ここまでできたら、設定画面にあるQRコードを使って友達登録。

 

あとはグループラインを作って自分と追加したやつ(チャネルというらしい)を追加。

 

実際に使ってみる

 LINEにさっそく、追加してみたい予定を送信!!

 

そしてGoogleカレンダーを見れば予定が追加されているはず!おめでとう!

 

「メッセージありがとう!~~~」みたいな長い文が毎回Botから送られてくるので、それが嫌な場合はGASからLINEを送るメソッドを書けばよい。

ものぐさなので私はやらないが。

 

追記:LINEDeveloperのMessagingAPIの設定から送るメッセージを変更できました。楽~。

 

う~ん、最高!

 

あとはカレンダーの通知設定が働いていればスマホにプッシュ通知が届く!これでもうちょっとした予定を忘れなくて済む!

 

 

今思えばGoogleカレンダーにいれるのではなく、LINEに送るようにすればよかったかな、と思う。

でもLINEを送る時間指定がめんどくさそうだし、GASなだけあってGoogle系は動かすのが楽なので後悔はしていない。

あとLINEに送ると読まない限り通知がたまるのでそれはよくないな……。

 

 

というものを作ったと知り合い(会社員兼ライター)に言ったら、LINEとスプレッドシートでタスク管理できるやつ作ってと言われた。

ので、今度作ります。多分そっちの方が色々便利になるはず。さらに、人に渡すものなのでもうちょっとちゃんと作ると思う。

 

自分用ならこんな感じで適当なもの作っちゃうんだけどね~。