🔖

ZoomのリリースノートをGASでSlackに通知させてみた

5 min read

全般

Zoomのアップデートを確認するのが面倒なので作ってみました。
スプレッドシートのIMPORTXML関数と簡単なGASで実装。
雰囲気で作って30分程度でした。

きっかけ

このツイートを見て「あ、うち(弊社)も通知させよう」と思ったことから

https://twitter.com/shihoshivakaya/status/1358608236966862848?s=20

実装方法

使用ツール

  1. スプレッドシート(標準の関数)
  2. Slack Incoming Webhooks
  3. Google Apps Script (=GAS)

完成イメージ

  1. スプレッドシート側

  2. Slack側

スプレッドシート側の準備

2021年2月9日にWindows側のRelease NotesのHTMLが変更されてバージョン部分がspanタグで囲われるようになった為、出力時にセルが分割されている。

  1. 新規シートを作成し、項目名を書く

  2. B2・B3セルに、WindowsとMacのリリースノートのリンクをそれぞれコピペしてくる

  3. 対象のURLを開く

  4. Chromeのデベロッパーツールを開く

  5. エレメント選択ツールをクリックする

  6. Current Releaseの下(日付・version)あたりをクリックする

  7. 6で選択した箇所がソースコード上でも選択済み(青塗り)になるので、[右クリック] > [Copy] > [Copy XPath] をクリックする

  8. C1(Win)・C2(Mac)ともに6をコピペする

  9. D2に =IMPORTXML(B2,C2) を入力する

  10. D3に =IMPORTXML(B3,C3) を入力する

  11. D列・E列に取得してきた情報が自動で出力される

  12. D列・E列を1つの文字列として扱いたいので、F列で結合

  13. G列は後述のScriptによって上書きされる

  14. H列はF列・G列をIF関数で比較

Slack側の準備

  1. [App] > [Incoming Webhooks] > [追加] をクリックする

  2. [Slackに追加] をクリックする

  3. 投稿先のチャンネルを選択して [Incoming Webhook インテグレーションの追加] をクリックする

  4. 必要な設定をして [設定を保存する] をクリックする

GAS側の準備 ~ソースコード編~

  1. 準備したスプレッドシートの [ツール] > [スクリプトエディタ] をクリックする
  2. 以下のサンプルコードを元にScriptを作成する
/**
 * Zoom の ReleaseNotes の更新通知Script
 * 
 * @return {boolean}
 * 
 * トリガー:毎日 午前9:00 ~ 10:00
 */

function notificationZoomReleaseNotes() {
  
  const ss         = SpreadsheetApp.openById("スプレッドシートID");
  const sheet      = ss.getSheetByName("シート名");
  const forWinLink = sheet.getRange("B2").getValue();
  const forMacLink = sheet.getRange("B3").getValue();
  const thisWinVer = sheet.getRange("F2").getValue();
  const thisMacVer = sheet.getRange("F3").getValue();
  const winDiff    = sheet.getRange("H2").getValue();
  const macDiff    = sheet.getRange("H3").getValue();
  
  // Slack通知用のフィールドオブジェクトの初期化
  let fields = [];

  // WinもMacも差分なければ終了。何も通知しない
  if (winDiff === true && macDiff === true) {
    return;
  }
  // Winだけfalse(差異がある)場合
  else if (winDiff === false && macDiff === true) {
    
    fields.push(
      {
        "title": "`Windows`", 
        "value": "<" + forWinLink + "|" + thisWinVer + ">", 
        "short": false
      }
    );
    
    sheet.getRange("G2").setValue(thisWinVer);
  }
  // Macだけfalse(差異がある)場合
  else if (winDiff === true && macDiff === false) {
    
    fields.push(
      {
        "title": "`Mac`", 
        "value": "<" + forMacLink + "|" + thisMacVer + ">", 
        "short": false
      }
    );
    
    sheet.getRange("G3").setValue(thisMacVer);
  }
  // WinもMacもfalse(差異がある)場合
  else {
    
    fields.push(
      {
        "title": "`Windows`", 
        "value": "<" + forWinLink + "|" + thisWinVer + ">", 
        "short": false
      },
      {
        "title": "`Mac`", 
        "value": "<" + forMacLink + "|" + thisMacVer + ">", 
        "short": false
      }
    );
    
    sheet.getRange("G2").setValue(thisWinVer);
    sheet.getRange("G3").setValue(thisMacVer);
  }
  
  // Slack通知の本文作成
  const slackBody =
  {
    "attachments" : [
      {
        "fallback": "Zoomのリリース情報だよ:bulb:",
        "color"   : "#258cfb",
        "pretext" : "<!channel>\n\nZoomの新しいバージョンが出たよ:bulb:\n必要なら <https://xxxxx.zoom.us/account/setting|[アカウント設定] &gt; [管理者オプション]> から最低バージョンの変更してね〜:feet:",
        "fields"  : fields
      }
    ], 
  };

  // インテグレーションのWebhook URL(本番)
  const url = "https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx";
  
  // 送信オプション
  const options = {
    method      : "post",
    contentType : "application/json",
    payload     : JSON.stringify(slackBody),
  };
 
  // 送信処理
  UrlFetchApp.fetch(url, options);

}

GASの準備 ~トリガー編~

  1. スクリプトエディタの左側メニューからトリガー(時計アイコン)をクリックする
  2. [トリガーを追加] をクリックして下記のように設定(サンプル)

その他

Zoomの管理者であれば、管理画面からクライアントの最低バージョンを制限できるようです。

感想

最初は単純にIMPORTXML関数で取得してきてGASの変更時トリガーで通知させようとしたけれども、見た目上変更も編集も行われていないのに勝手にトリガー起動して通知きてホラーだったので、意図的に前回値と比較する作りにしました。