Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EnebularMeetup_GoogleCalendar

 EnebularMeetup_GoogleCalendar

NearMugi

June 03, 2022
Tweet

More Decks by NearMugi

Other Decks in Technology

Transcript

  1. 定期的な予定をGoogleカレンダーへ
    簡単に追加できる仕組みを作ってみた
    2022.06.02
    【オンライン】enebular developer meetup

    View full-size slide

  2. 自己紹介
    NearMugi(ニアムギ)
    普段はねこIoTLTで活動しています。
    ねこ2匹飼っています。

    View full-size slide

  3. イントロ
    今回は「定期的な予定をGoogleカレンダーへ
    簡単に追加できる仕組みを作ってみた」お話で

    View full-size slide

  4. イントロ
    我が家では定期的な予定(例えば子どもの迎えの担当)を
    Googleカレンダーを使って家族で共有しています。

    View full-size slide

  5. イントロ
    そこで妻より・・・
    ・Googleカレンダーの予定をコピーするのが面倒
    ・簡単にコピーできる方法ない?

    View full-size slide

  6. イントロ
    確かに手間がかかります
    ・コピーしたい予定をクリック
    ・複製を選択
    ・日付を変更
    ・保存

    View full-size slide

  7. イントロ
    簡単に複製する機能はなさそうだったため、作ってみました

    View full-size slide

  8. 仕組みの概要
    入力を簡単にするため、スプレッドシートにある情報を
    Googleカレンダーへ自動で反映させるようにしました
    一つ一つ予定を入れるよりも楽!

    View full-size slide

  9. 仕組みの概要
    ただ、スプレッドシートを開いて編集するのも手間なので
    AppSheetを使ってLINEから入力できるようにしています。

    View full-size slide

  10. 仕組みの概要
    全体像はこんな感じです




    ①LINEからSpreadSheetへ
    ②Cronで定期的に取得
    ③カレンダー情報と比較
    ④カレンダーを更新

    View full-size slide

  11. Node-RED の部分
    Node-REDのフローは以下の通りです。
    1. Googleカレンダーの情報を取得
    2. スプレッドシートの情報を取得
    3. 差分(追加/更新/削除)を判別
    4. Googleカレンダーへ反映

    View full-size slide

  12. Node-RED の部分
    1. Googleカレンダーの情報を取得
    Googleカレンダーへアクセスするノードがありませんでした・・
    そのためPython + execノードで処理しています

    View full-size slide

  13. Node-RED の部分
    (補足)Googleカレンダーにアクセスするソースについて
    取得(Get)・追加(Insert)・更新(Update)・削除(Delete)を指定する
    テキストファイルを渡すと、いい感じに処理してくれるプログラムを用意しました
    1文字目がG の場合は
    Googleカレンダーの情報をGetする

    View full-size slide

  14. Node-RED の部分
    追加・更新・削除の場合
    同じように1文字目が
    I の場合は追加
    Uの場合は更新
    Dの場合は削除
    となります。

    View full-size slide

  15. Node-RED の部分
    2. スプレッドシートの情報を取得
    スプレッドシートはノードがあるので、簡単にデータを取得できます

    View full-size slide

  16. Node-RED の部分
    3. 差分(追加/更新/削除)を判別
    ここが一番の難関でした。
    判別のルールは以下の通りです。
    スプレッドシート : o , Googleカレンダー : x -> 追加
    スプレッドシート : o , Googleカレンダー : o(完全一致) -> スキップ
    スプレッドシート : o , Googleカレンダー : o(一部差分) -> 更新
    スプレッドシート : x , Googleカレンダー : o -> 削除

    View full-size slide

  17. Node-RED の部分
    比較できるようにGoogleカレンダーのデータと、スプレッドシートのデータを整形しま

    取得したGoogleカレンダーのデータ
    こんな感じに整形

    View full-size slide

  18. Node-RED の部分
    どのように整形しているかというと、splitノードで1行ずつ読み、jsonata形式でコネコ
    ネしてファイルに出力しています

    View full-size slide

  19. Node-RED の部分
    スプレッドシートのデータも同様に整形していきます
    取得したスプレッドシートのデータ
    こんな感じに整形

    View full-size slide

  20. Node-RED の部分
    Googleカレンダーと違い、1行目がヘッダーであること、途中に空白行があることに注
    意して整形します。
    取得したデータ
    スプレッドシート

    View full-size slide

  21. Node-RED の部分
    整形の考え方はGoogleカレンダーとやり方は同じです
    ヘッダーや空白行はスキップします

    View full-size slide

  22. Node-RED の部分
    データの形式は揃ったのであとは比較するだけです。

    View full-size slide

  23. Node-RED の部分
    整形のときと同じようにsplitノードやchangeノードで比較・・・
    したかったのですが断念しました・・・
    日付のあり/なしで追加と削除は出来そうかなと思ったのですが
    更新を判定するには他の項目(summaryなど)もチェックするので
    お手上げでした。

    View full-size slide

  24. Node-RED の部分
    そのため、比較用のプログラムを用意して解決しました
    Pythonでは素直に出来ました

    View full-size slide

  25. Node-RED の部分
    4. Googleカレンダーへ反映
    すでに材料と道具が揃っています。比較した結果をプログラムに渡してあげればOKです。

    View full-size slide

  26. まとめ
    ・データの読み込み・比較・書き込みといったお勉強のようなシステム
     作りでした。
    ・Googleカレンダーのノードがあるといいな。。
    以上となります。
    ご清聴ありがとうございました。

    View full-size slide