名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

Confluenceからの通知メールをGASで拾って、Discordに通知するものを作った

モチベーション維持のために作りました。

TL; DR;

  • コードはここに
  • https://github.com/yumechi/gas-mail-check
  • GAS で Gmail を Filter して検索、一定の条件でさらに Filter しつつ、Discord に投稿する
  • Confluence で WebHook するのは Slack の場合は簡単にできそうだったが、それ以外だと厳しかったので、この方法にした
  • API 経由でやる方法を知りたいような気はするが、今は後回し

できたもの

隠したほうがいいあれをしょりした。

f:id:MireiMixin:20200615050158p:plain

やったこと

  • GAS で Gmail を検索する
    • GmailApp.search(条件) で取れる
    • 条件は環境変数からとるものと、直近 1 日にした
    • ちなみに環境変数は特定のメールアドレスから、としてる(公開はしたくなかったので環境変数に隠した)
  • 検索したメールから情報を取り出す
    • この検索メソッドから得られるのはメール本体じゃなく、スレッド
    • なのでスレッドからさらにメールを取り出す
    • なぜと思ったけど、表示みたら自然な気がしてきた
  • 重複チェックをする
    • メールの持つメッセージ ID で重複チェック(基本的には被らない値)
    • データ保持は Spread Sheet
    • すでに WebHook 送信したものはスプレッドシートの A1 セルに書いてあるので、その場合はスキップ
    • シートがない場合はこの時点でシートを作る
      • 参考にした
      • (ちなみにこれ、 set_sheet じゃなくて get_sheet だよねと思った)
  • WebHook に投げる
    • 投げてるのは日付、変更ページ(メールタイトルから推測)、編集者(送信者から推測)
    • 日付は Utilities.formatDate(date, "JST", formatString); すると楽にフォーマットできる
    • Class Utilities  |  Apps Script  |  Google Developers 便利なので使ってほしい
  • 重複チェックのため Spread Sheet に書き込む
    • 単に A1 セルにメッセージ ID を追加してるだけ

学んだこと

  • 日付のフォーマットめんどい
    • Utilities.formatDate を発見できなかったら終わっていた
    • 世の中の人は本当にどうしてるんだろう
      • 筆者は頭が Python なので strftime とかでいいじゃんとか思ったけど、そういうのがぱっと出てこない?
      • 日付に関する処理、結構ごり押しのものが見つかるけどサジェストが残念なことになっている?
  • Sheet がなければ作る処理、便利かも
    • 汎用メソッド集を作りたい
  • 狙ったシートの狙ったセルだけ書き換えるのも結構めんどくさい
    • 汎用メソッド集を作りたい
    • あと今の処理もあってるかどうかちょっと怪しい(range とって cell 取って set ってしてるけど、cell だけ取りたい場合って本当にこの手順でやらないと駄目なのか)
  • GoogleAppsScript.Base.Date なるものがある
    • メッセージを取り出すときに気が付く
    • 通常のものと何が違うのかまだ理解していない
  • TypeScript の type 定義を覚えた
    • 上に関連して type GeneralDate = Date | GoogleAppsScript.Base.Date; を定義した
  • Discord の WebHook 簡単すぎる
    • マジでこんなに簡単に作れていいのか、ありがたし

展望

  • 重複チェック用のシートの作りが微妙なので改善したい
    • 古いシートを消す処理がないので、シートがたまるようになってしまっている
    • 月 1 とかで消して作り直してしまう?
    • どちらにしろ Batch 処理が必要そう
    • 更新数が少ないものなので影響が小さい、問題になってから対処でもいいような気はする
  • 週ごとの成果を出したい
    • モチベーションは上げていきたい
  • もう少しデプロイを工夫する
    • はい
  • Confluence の API を使う
    • はい
    • とりあえずぱっと WebHook 的に更新がありましたという情報を得るためのものはなさそうだった
      • Streaming API 的なものを使ってアップしろみたいな雰囲気を感じる
      • サンプルがあまり手に入らないので、かなり険しい、とりあえず今の忙しさでは時間だけが解けて気持ちが壊れるので却下
    • 適当に API たたく例もあまり出てこない
      • バッチ処理API たたいて、適当に重複排除すれば行けそうだなとは思った
      • が、それすらほぼ出てこない
    • というか API を使うためのもろもろの状況が分からなさすぎる(API KEY 発行が難しそうな雰囲気)
    • とりあえず自分用の JIRA と Confluence 立てたので、この辺いじりながら何かを発見したい
      • いきなり今動いてるプロジェクトでやるのはきつかった

まとめ

Confluence API で何とかしようと思って 3 時間くらい調べてこれ無理だなってなってからメールを見て、これだと思ってから手を素早く動かしてできたのはよかったと思います。作りがいろいろ雑な部分はありますが、個人的にはまあいいかなと思ってます。