みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
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); } }
流れとしては、以下のようになります。
- Gmailから未読の問い合わせメールのスレッドを抽出する
- 抽出したすべてのメッセージについて
- 各メールから日時、送信元、件名、本文抜粋、パーマリンク、メッセージIDを取り出して配列に格納
- スプレッドシートの最後尾に配列の内容を書き出す
問い合わせをChatworkに通知しつつタスクを立てる
スプレッドシートに追加するメッセージ一つ一つについて、Chatworkへ通知をしてタスクを追加していけばよいですね。
スクリプトとしては28行目の下に、以下のような処理を入れればOKです。
- Chatworkへ送るメッセージを生成
- そのメッセージをChatworkに送る
- Chatworkへ立てるタスクを生成
- そのタスクをChatworkで立てる
Chatworkにメッセージを送る
まずChatworkにメッセージを送る部分について考えます。
以下記事で作成した、sendMessageという関数を少しカスタマイズして流用します。
関数はこちらです。
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という関数をカスタマイズして流用します。
関数はこちらです。
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のメッセージ記法が含まれているので、それについては記事もご参考ください。
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); } }
こちらのスクリプトを実行してみました。
無事にメッセージも送信できていますし、タスクも追加できていますね。
まとめ
Gmailに届いた問い合わせメールをスプレッドシートに集計記録しつつ、それをChatworkに通知しながらタスクも追加する、そんな素敵なシステムをGoogle Apps Scriptで作成することができました。
しかも、イベントトリガーで5分ごととか10分ごとに設定をしておけば完全自動で全ての動作がなされます。
便利ですね~。
次回はGmailの読み取り件数の制限という注意すべき点についてお伝えします。
どうぞお楽しみに!
連載目次:GASでGmailに届いた問い合わせメールを収集する
お仕事の現場では日々様々なメールが届きます。その中で重要なのが「問い合わせメール」ですね。このシリーズでは、Webサイトからの問い合わせメールを自動でスプレッドシートに取り込んだり、チャットワークに送る方法についてお伝えしていきます。
コメント
チャットワークとの連携について詳しく書いて頂きありがとうございます。
質問なのですが、チャットワークに送るメッセージでルーム内全員にTo付けで送ることはできますでしょうか?
ナシタカ様
コメントを頂きましてありがとうございます。
チャットワークに送るメッセージを生成する箇所にて、メンバー全員分の[To:XXXXXX]を連結することで実現は可能です。
チャット内の全てのメンバーのアカウントIDを取得する必要がありますが、以下リクエストで取得できます。
詳細は以下チャットワークAPIのドキュメントもご覧いただければと思います。
http://developer.chatwork.com/ja/endpoint_rooms.html#GET-rooms-room_id-members
いつも非常に参考になる内容をありがとうございます。Twitterの方でもフォローさせていただいております。
今回この件でお伺いしたいことがございます。
送信元・件名が固定で受信したメールをこのスクリプトでチャットワークへ飛ばそうとしているのですが、送信元・件名が同じだと同一スレッドになってしまい一番最初に受信したメールの内容が飛んでしまい、かつ最新のメールは既読にならないといった状態になっております。
送信元・件名は固定することしかできないので、そういったものへの対応はできるのでしょうか??
ゆうすけさん
コメントありがとうございます。
同様の悩みはみなさんお持ちのようで、よく問い合わせをいただきます。
少し手間はかかりますが、重複をはじく方法として、既読をする方法ではなく、メッセージIDを使う方法がおすすめです。
以下記事で紹介していますので、ごらんくださいませ。
https://tonari-it.com/gas-gmail-message-getid/
早速のご返信ありがとうございます!
是非参考にさせていただきます!
もしかしたらまた、お聞きしてしまうかもしれませんがどうぞよろしくお願いいたします。
タカハシノリアキ様
先日いただきましたアドバイスのお陰で、無事に送信元・同件名の新着未読メールをチャットワークに投稿〜メール既読処理まですることができました。
本当にありがとうございました!これでさらに捗ります`‐ω‐´)!
ゆうすけさん
メッセージありがとうございます!
お役に立てて良かったです!
今後ともどうぞよろしくお願いいたします。