【Google App Script】メールをスプレッドシートに転記して、Chatworkに通知する

Google App Script

はじめに

業務で重要なメールを見逃さず管理したい、または特定の条件に合うメールをスプレッドシートに自動で保存したいと思ったことはありませんか?さらに、その情報をChatworkでチームに通知できれば、効率的な情報共有が可能になります。
本記事では、Google App Script(以下GAS)を活用して、Gmailの情報をスプレッドシートに転記し、Chatworkに通知する方法を解説します。初学者でも実践しやすいコード例を紹介しますので、ぜひ参考にしてください!

そもそもGoogle App Script(GAS)とは

Google App Scriptは、Googleが提供するクラウドベースのスクリプト開発環境です。
JavaScriptに似た文法を使用し、Google Workspaceアプリ(例: Gmail、スプレッドシート、Googleカレンダー)と簡単に統合できます。もちろん、その他アプリともAPIを使用して連携可能です。

無料で利用可能で、スケジュール実行やWebhookの利用なども可能なため、業務の自動化に最適です。

データ量がある程度大きな規模になるまでは、様々な情報をスプレッドシートで管理して、GASで自動化できるところを自動化して、運用していくでよいと個人的に思ってます。

Google App Script(GAS)の開き方

スプレッドシートを開いて、拡張機能→Apps Scriptをクリック

正確にはスプレッドシートから開かなくてもいけるのですが、自分は大体スプシと紐づいたGoogle App Script(GAS)を使用しますね

開いたGoogle App Script(GAS)にコードを書いていきます!

①メール情報の取得

Gmailのメッセージを取得するには、GASのGmailAppクラスを使用します。
以下の例では、未読のメールを取得して1件ずつ処理を書いてます。

  // 未読のメールを取得
  var threads = GmailApp.search('is:unread is:inbox');
  // スレッドにの集合を取得する
  var threads = GmailApp.getMessagesForThreads(mailThreads); 

  // スレッドの集合をループ
  for (let i = 0; i < threads.length; i++){
      thread = threads[i];
      // スレッドをループ
      for (let j = 0; j < thread.length; j++){
          <1つのメールに対する処理>
      }
  }

②スプレッドシートへの書き込み

スプレッドシート書き込み処理には、SpreadsheetAppクラスを使用します。
以下の例では、指定したスプレッドシートに“a”, “b”, “c”, “d”, “e”を書き込んでいます。

  // スプレッドシート指定
  const spreadsheet = SpreadsheetApp.openById(<スプレッドシートのID>);
  const sheet = spreadsheet.getSheetByName(<スプレッドシートの名前>);
  // 入力したい配列
  list = ["a", "b", "c", "d", "e"]
  // シートの指定範囲(1行目1列目から幅5列の1行分)を取得
  const setRange = sheet.getRange(1, 1, 1, 5);
  // 値の書き込み(二次元配列を入力)
  setRange.setValues([list]);  

③ChatWorkに通知

APIトークンの確認

Chatwork右上のメニューからサービス連携→APIトークンを開いて、APIトークンの確認・発行を行います。

チャットグループのルームIDを確認

メッセージを送りたいチャットグループをブラウザで開いて、URLの中にある以下のIDを確認します。

GASからChatWorkにデータを送信

ChatWorkにメッセージを送信するには、チャットにメッセージを投稿するエンドポイントを使用します。
以下の例では、テストという文字列を指定したルームIDのチャットグループに送信しています。

function sendChatworkMessage() {
  var chatworkApiToken = <APIトークン>;
  var roomId = <ルームID>;
  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  var options = {
    method: 'POST',
    headers: { 'X-ChatWorkToken': chatworkApiToken },
    payload: { body: "テスト"}
  };

  var response = UrlFetchApp.fetch(url, options);
  
  if (response.getResponseCode() == 200) {
    Logger.log('メッセージ送信成功');
  } else {
    Logger.log('メッセージ送信失敗');
  }
}

実用的なコード例

上記のコードを統合して、以下の処理を行う全体コードを紹介します!

  1. 特定のラベルを持つ未読メールから件名と本文を取得する
  2. 情報を管理しているスプレッドシートに情報を保存する
  3. チャットアプリに通知する
// 定数
const SPRED_SHEET_ID = <スプレッドシートのID>
const SPRED_SHEET_NAME = <シートの名前> 
const CHATWORK_ROOM_ID = <ChatworkのルームID>
const CHATWORK_TOKEN = <ChatworkのAPIトークン>

// メイン処理関数
function main() {
  // テストから始める文字列を抜き出す正規表現
  targetRegexp = /テスト.*/

  // 未読のメールから指定件名のメールからの情報のリストを取得
  unreadTargetMailInfoList = getUnreadTargetMailInfoList(targetRegexp);

  // 指定件名メールからの情報のリストがある場合
  if (!(unreadTargetMailInfoList.length == 0)) {
    // メールのリストから情報を取得して
    writeSpreadSheet(unreadTargetMailInfoList)
    // Chatworkにメッセージを送信
    sendChatworkMessage("メールを検知して管理シートに書き込みを行いました。対応を進めてください。");
  }
}

// 未読のメールから指定の件名のメールを返す関数
function getUnreadTargetMailInfoList(targetRegexp) {
  // リターン値定義
  returnTagetMailInfoList = []

  // 未読のメールを取得
  const unreadMails = GmailApp.search('is:unread is:inbox');
  // スレッドにの集合を取得する
  const threads = GmailApp.getMessagesForThreads(unreadMails); 
  // 時刻の古い順に並べ替え
  threads.reverse();
  Logger.log(`すべてのスレッド(${threads.length}件)を取得しました。`);

  // スレッドの集合をループ
  for (let i = 0; i < threads.length; i++){
      thread = threads[i];
      // スレッドをループ
      for (let j = 0; j < thread.length; j++){
        // メッセージを取得
        message = thread[j];
        // 件名を取得
        const subject = message.getSubject();
        // Logger.log(subject);
        // 本文を取得
        const body = message.getPlainBody();
        // Logger.log(body);

        // 件名がtargetRegexpにマッチするか
        var targetSubject = subject.match(targetRegexp);

        // マッチしない場合はcontinue
        if (!targetSubject){
          continue
        }
        
        // 件名と本文を格納した配列
        targetSubject = [subject, body]

        // 件名と本文を格納した配列をリターン値に格納
        returnTagetMailInfoList.push(targetSubject)

        // 既読にする
        GmailApp.markMessageRead(message);
      }
  }

  return returnTagetMailInfoList
}

// スプレッドシートに書き込み
function writeSpreadSheet(matrix) {
  // スプレッドシート指定
  const spreadsheet = SpreadsheetApp.openById(SPRED_SHEET_ID);
  const sheet = spreadsheet.getSheetByName(SPRED_SHEET_NAME);      //シート最終行の値を取得する
  // 最終行を取得
  var lastRow = sheet.getLastRow();
  // シートの指定範囲を取得
  const setRange = sheet.getRange(lastRow + 1, 1, Number(matrix.length), Number(matrix[0].length));
  // 値の書き込み(二次元配列を入力)
  setRange.setValues(matrix);
}

// Chatworkへメッセージを送信する関数
function sendChatworkMessage(message) {
  var chatworkApiToken = CHATWORK_TOKEN;
  var roomId = CHATWORK_ROOM_ID;
  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  var options = {
    method: 'POST',
    headers: { 'X-ChatWorkToken': chatworkApiToken },
    payload: { body: message }
  };

  var response = UrlFetchApp.fetch(url, options);
  
  if (response.getResponseCode() == 200) {
    Logger.log('メッセージ送信成功');
  } else {
    Logger.log('メッセージ送信失敗');
  }
}

まとめ

本記事では、GASを活用してGmailのメール情報をスプレッドシートに転記し、チャットアプリに通知する方法を解説しました。この仕組みを応用すれば、業務効率化が大幅に向上します。ぜひこの記事を参考に、ご自身のワークフローに組み込んでみてください。

参考文献

コメント

Verified by MonsterInsights
タイトルとURLをコピーしました