特定のOutlookメール情報をGoogleスプレッドシートへ記録するボット


Outlookメールから、特定の宛先・件名のメールを受信したら、Googleスプレッドシートに記録するボットを作りました。

【メール】

【スプレッドシート】

作成経緯

勤め先の会社で運用しているシステムで何かしらエラーが発生した際にメールと電話連絡が来て対応してます。
都度、対応(解決)しますが、四半期ごとにユーザーへエラー発生件数や原因、対応などの報告が必要になるので、せめて発生日とエラー内容を纏めておきたかったので、内容を記録出来るようにしてみました。

構成

Integromat
・「Microsoft 365 Email -Watch messages」でOutlook連携し、条件に合致するメールを検索。
・「HTTP -Make a request」でGoogle Apps Script の Webhook へPOSTリクエスト。
 

Google Apps Script(GAS)
・スクリプトのWebhookを有効にして、「doPost」でパラメータ受け取り。
・受け取ったパラメータをスプレッドシートに書き込み。

実装

Integromat

●Microsoft 365 Email - Watch messagesを追加
・Connection:自身のメールアドレス ※ログインしてIntegromatを有効化
・Folder:受信トレイ(検索先)
・Watch:Only unread(未読のみ)
・Search:From:[メールアドレス] Subject:Critical Subject:Warning
 (特定のアドレスから かつ 件名にCriticalかWarningを含む)

●HTTP - Watch messages
・URL:[GASのWebhook URL]?subject={{4.subject}}&dates={{4.createdDateTime}}
・Method:POST
※subjectに件名、datesに受信日を渡してPOSTして、GAS側でこのパラメータをシートに記録します。
 

Google Apps Script スクリプト

●新規でスプレッドシートを作成し、「ツール」から「スクリプトエディタ」を起動。

.gs
// POSTリクエスト
function doPost(e) {
  // body部のJSONを受け取り ※上手く取れないから止めた。
  // var params = JSON.parse(e.postData.getDataAsString());
  // var subject = params.subject;

  // 受け取ったキーをスプレッドシートに書き込み(URLパラメータ)
  writeLogToSheet(e.parameter.subject, e.parameter.dates);
  // データ内容を返します
  const data = { text: `POSTリクエスト` };
  return ContentService.createTextOutput(JSON.stringify(data));
}

// シートにログを書き込む
function writeLogToSheet(subject = 'x', dates = 'y') {
  // シート取得
  const sheet = SpreadsheetApp.getActiveSheet();
  // ループを回して1行ずつすでに記録されていないか確認していく
  let currentRow = 1;
  while (true) {
    // 記録されていない行が見つかったとき:
    if (!sheet.getRange(currentRow, 1).getValue()) {

      // 1列目にdatesを記録(受信日)
      sheet.getRange(currentRow, 1).setValue( Utilities.formatDate(new Date(dates), "JST", "yyyy/MM/dd (E) HH:mm:ss") );
      // 2列目にSubjectを記録(件名)
      sheet.getRange(currentRow, 2).setValue( subject );
      // ループ中断
      break;
    }
    currentRow++;  // 次の行へ
  }
}

●スクリプトエディタで「公開」タブの「ウェブアプリケーションとして導入」を選択。
・Project version:New
・Execute the app as:自身のGoogleアカウント
・Who has access to the app:Anyone,even anonymous
●WebhookのURLをコピーして、Integromatの「HTTP - Watch messages」のURLに張り付け。

今後の展開

メールの内容も渡そうと思ったが、上手く取れなかった。html形式で取れるようだが、parameterでは取れない。BodyにJSON形式で渡してみようとしたが、これも上手く取得できず。(コメント化した部分)

わざわざWebhookでやる必要もない気もします。IntegromatでGoogleスプレッドシートの追記とかも出来そうなので。(試してないですが。)また、MS系なら、Power Automateのほうが楽かも。(これも試してない。)

Microsoft 365 と連携しようと思えばできるのは新たな発見。(セキュリティ上会社でNGかも。。)メールの内容から必要な文字列だけ抜き出して記録出来るとなお良しかな、、(今後に期待。)