【GAS】Gmailに来た問い合わせをChatworkに通知してかつタスク追加する


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptを使って問い合わせメールをスプレッドシートに記録したり集計したりといったシステムを作っています。

前回はこちらの記事。

【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
Gmailの未読メールを取得する方法、メールを既読にする方法などを活用して、Google Apps Scriptで問い合わせメールを都度スプレッドシートに追加していく方法についてお伝えします。

Gmailから新しい問い合わせメールのみスプレッドシートに追加する方法をお伝えしました。

さて、スプレッドシートへの収集はできたのですが、それと同時にチャットツールに転送してくれたりしたら便利ですよね?

さらに、タスクなんかも立ててくれたり…便利すぎる。

ということで、今回はChatworkを使って以下の機能を追加していきます。

  • 問い合わせメールの通知をChatworkに送る
  • 問い合わせメール対応のタスクを立てる

では、行ってみましょう!

前回のおさらい

まず前回作成したGmailから問い合わせメールを検索抽出して、スプレッドシートに追加するスクリプトのおさらいです。

function searchContactMail() {
 
  const query = '"このメールは 株式会社プランノーツ http://plannauts.co.jp のお問い合わせフォームから送信されました"';
  const start = 0;
  const max = 10;
 
  const threads = GmailApp.search(query, start, max);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
 
  const values = [];
  const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const ids = sheet.getRange(2, 6, lastRow).getValues().flat();
 
  for(const messages of messagesForThreads){
    const message = messages[0];
    const id = message.getId();
   
    if(!ids.includes(id)){
      const record = [
        message.getDate(),
        message.getReplyTo(),
        message.getSubject(),
        message.getPlainBody().slice(0,200),
        message.getThread().getPermalink(),
        message.getId()
      ];
      values.push(record);
    }
  }
   
  if(values.length > 0){
    sheet.getRange(lastRow + 1, 1, values.length, values[0].length).setValues(values);
  }
 
}

流れとしては、以下のようになります。

  1. Gmailから未読の問い合わせメールのスレッドを抽出する
  2. 抽出したすべてのメッセージについて
    1. 各メールから日時、送信元、件名、本文抜粋、パーマリンク、メッセージIDを取り出して配列に格納
  3. スプレッドシートの最後尾に配列の内容を書き出す

問い合わせをChatworkに通知しつつタスクを立てる

スプレッドシートに追加するメッセージ一つ一つについて、Chatworkへ通知をしてタスクを追加していけばよいですね。

スクリプトとしては28行目の下に、以下のような処理を入れればOKです。

  • Chatworkへ送るメッセージを生成
  • そのメッセージをChatworkに送る
  • Chatworkへ立てるタスクを生成
  • そのタスクをChatworkで立てる

Chatworkにメッセージを送る

まずChatworkにメッセージを送る部分について考えます。

以下記事で作成した、sendMessageという関数を少しカスタマイズして流用します。

【GAS】チャットワークのメッセージを取り出す関数とメッセージを送る関数
Google Apps Scriptを活用してチャットワークにおみくじチャットを作成しています。今回はチャットワークからメッセージを取り出す、メッセージを送る処理を関数化して全体のコードをスッキリさせます。

関数はこちらです。

function sendMessage_(body){
  const params = {
    headers: {"X-ChatWorkToken" : CW_TOKEN},
    method: "post",
    payload: {
      body: body
    }
  };
 
  const url = "https://api.chatwork.com/v2/rooms/" + ROOM_ID + "/messages";
  UrlFetchApp.fetch(url, params);
}

メッセージ本文を成形して引数bodyとして渡すと、ROOM_IDで指定したグループチャットに送信します。

ちなみに、関数名の後ろにアンダースコア(_)を入れると、プライベート関数となり、関数を選ぶプルダウンなどに表示されなくなります。

プロジェクト内からしか呼ばれない関数はプライベート関数にしておくと良いです。

Chatworkにタスクを立てる

続いてChatworkにタスクを立てる部分を作成していきます。

こちらも以前紹介したaddTaskという関数をカスタマイズして流用します。

Google Apps Scriptでチャットワークにタスクを追加する最も簡単なプログラム
チャットワークの大きな特徴であるタスク機能がもAPIを使って操作することができます。今回はGoogle Apps Scriptでチャットワークにタスクを追加する最も簡単なプログラムを紹介します。

関数はこちらです。

function addTask_(task){
  const params = {
    headers : {"X-ChatWorkToken" : CW_TOKEN},
    method : "post",
    payload : {
      body : task,
      to_ids : ACCOUNT_ID
    }
  };
 
  const url = "https://api.chatwork.com/v2/rooms/" + ROOM_ID + "/tasks";
  UrlFetchApp.fetch(url, params);
}

タスク内容を引数taskとして渡すと、ROOM_IDで指定したグループチャットに、ACCOUNT_IDで指定した担当者でタスクを追加します。

payloadの中にはタスク期限を表すlimitも設定できるのですが、今回はなしで作っています。

例えば以下のようにするわけです。

    const task = `問い合わせメール: ${subject}`
    addTask_(task);

これで「問い合わせメール:件名」というようなタスクが追加されるわけです。

Chatworkに送るメッセージを生成

Chatworkに送るbodyやtaskを生成して、それぞれの関数を呼び出す用の関数も作りました。

こちらです。

const CW_TOKEN = 'xxxxxxxxxx'; //Chatwork APIトークン
const ROOM_ID = 'xxxxxxxxxx'; //ルームID
const ACCOUNT_ID = 'xxxxxxxx'; //アカウントID
const SS_URL = 'https://docs.google.com/spreadsheets/d/xxxxxxxxxx/edit#gid=0'; //スプレッドシートURL

function sendChatwork_(record) {
 
  const [date, replyTo, subject, plainBody, permalink] = record;
 
  let body = '';
  body += `[To:${ACCOUNT_ID}][info][title]問い合わせメール from ${replyTo}[/title]`;
  body += plainBody;
  body += '[hr]';
  body += `メッセージURL: ${permalink}n`;
  body += `問い合わせ記録: ${SS_URL}`;                                                                
  body += '[hr]';
  body += `${date}[/info]`;  
  sendMessage_(body);
                                                                   
  const task = `問い合わせメール: ${subject}`                                                                
  addTask_(task);                                                                
}

シートの一行分のデータを格納した配列をrecordとして受け取って、それぞれに送るbodyやtaskを生成します。

Chatworkのメッセージ記法が含まれているので、それについては記事もご参考ください。

Google Apps ScriptでチャットワークにToや返信でメッセージを送る
Google Apps Scriptでチャットワークのおみくじチャットを作っています。今回はチャットワークのメッセージ記法を使って、おみくじの結果をToや返信のメッセージにする方法です。

Chatworkにメッセージ転送&タスク追加するスクリプト

メインのスクリプトである、searchContactMail関数はこちらです。

29行目で、sendChatwork_関数を呼び出すだけですね。

function searchContactMail() {
 
  const query = '"このメールは 株式会社プランノーツ http://plannauts.co.jp のお問い合わせフォームから送信されました"';
  const start = 0;
  const max = 10;
 
  const threads = GmailApp.search(query, start, max);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
 
  const values = [];
  const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const ids = sheet.getRange(2, 6, lastRow).getValues().flat();
 
  for(const messages of messagesForThreads){
    const message = messages[0];
    const id = message.getId();
   
    if(!ids.includes(id)){
      const record = [
        message.getDate(),
        message.getReplyTo(),
        message.getSubject(),
        message.getPlainBody().slice(0,200),
        message.getThread().getPermalink(),
        message.getId()
      ];
      values.push(record);
      sendChatwork_(record);
    }
  }
   
  if(values.length > 0){
    sheet.getRange(lastRow + 1, 1, values.length, values[0].length).setValues(values);
  }
 
}

こちらのスクリプトを実行してみました。

問い合わせメールをChatworkに通知してタスクを追加

無事にメッセージも送信できていますし、タスクも追加できていますね。

まとめ

Gmailに届いた問い合わせメールをスプレッドシートに集計記録しつつ、それをChatworkに通知しながらタスクも追加する、そんな素敵なシステムをGoogle Apps Scriptで作成することができました。

しかも、イベントトリガーで5分ごととか10分ごとに設定をしておけば完全自動で全ての動作がなされます

便利ですね~。

次回はGmailの読み取り件数の制限という注意すべき点についてお伝えします。

Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法
Google Apps Scriptでメールを取得する際には、1日あたりのGmailの読み取り件数の制限があるので注意をしなければなりません。今回は、その制限の内容と対処法についてお伝えします。

どうぞお楽しみに!

連載目次:GASでGmailに届いた問い合わせメールを収集する

お仕事の現場では日々様々なメールが届きます。その中で重要なのが「問い合わせメール」ですね。このシリーズでは、Webサイトからの問い合わせメールを自動でスプレッドシートに取り込んだり、チャットワークに送る方法についてお伝えしていきます。

  1. 【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
  2. 【GAS】Gmailからメールを検索してスプレッドシートに書き出す方法
  3. 【GAS】Gmailのメッセージから返信先とパーマリンクを取得する方法
  4. 【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
  5. 【GAS】Gmailに来た問い合わせをChatworkに通知してかつタスク追加する
  6. Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法

コメント

  1. ナシタカ より:

    チャットワークとの連携について詳しく書いて頂きありがとうございます。

    質問なのですが、チャットワークに送るメッセージでルーム内全員にTo付けで送ることはできますでしょうか?

  2. ゆうすけ より:

    いつも非常に参考になる内容をありがとうございます。Twitterの方でもフォローさせていただいております。

    今回この件でお伺いしたいことがございます。

    送信元・件名が固定で受信したメールをこのスクリプトでチャットワークへ飛ばそうとしているのですが、送信元・件名が同じだと同一スレッドになってしまい一番最初に受信したメールの内容が飛んでしまい、かつ最新のメールは既読にならないといった状態になっております。
    送信元・件名は固定することしかできないので、そういったものへの対応はできるのでしょうか??

    • ゆうすけさん

      コメントありがとうございます。

      同様の悩みはみなさんお持ちのようで、よく問い合わせをいただきます。
      少し手間はかかりますが、重複をはじく方法として、既読をする方法ではなく、メッセージIDを使う方法がおすすめです。
      以下記事で紹介していますので、ごらんくださいませ。

      https://tonari-it.com/gas-gmail-message-getid/

  3. ゆうすけ より:

    早速のご返信ありがとうございます!

    是非参考にさせていただきます!

    もしかしたらまた、お聞きしてしまうかもしれませんがどうぞよろしくお願いいたします。

  4. ゆうすけ より:

    タカハシノリアキ様

    先日いただきましたアドバイスのお陰で、無事に送信元・同件名の新着未読メールをチャットワークに投稿〜メール既読処理まですることができました。

    本当にありがとうございました!これでさらに捗ります`‐ω‐´)!

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