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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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




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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide