質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

Q&A

解決済

3回答

3927閲覧

【GAS】Gmail→Chatworkへ自動転送

narururu

総合スコア172

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

0グッド

1クリップ

投稿2021/09/10 06:53

解決したい課題

Gmailが届いたらchatworkへ自動転送させたいです。

現状

Gmailは指定の「テスト」ラベルに振り分けられて届いています。
未読の状態でGASを実行してもchatworkの「テスト」スレッドに転送されません。

コード

var apiToken = "{API_TOKEN}"; var postUrl = "https://api.chatwork.com/v2/rooms/{roomID}/messages"; // 通知したいchatworkのチャネル(部屋) var postChannel = "テスト"; // 抽出元のGmailのラベル var checkLabel = "テスト "; function myFunction() { // 未読の指定ラベル を検索 var threads = GmailApp.search('is:unread label:' + checkLabel); var count = threads.length; Logger.log("対象件数:" + threads.length); for(var i = 0; i < count; i++) { var lastDate = threads[i].getLastMessageDate(); var datetime = lastDate.getFullYear() + "/" + (lastDate.getMonth() + 1) + "/" + lastDate.getDate() + " " + lastDate.getHours() + ":" + lastDate.getMinutes() + ":" + lastDate.getSeconds(); var messages = threads[i].getMessages(); //同じ件名で、ネストされたメッセージを個別に if(messages.length > 0){ for(var j = 0; j < messages.length ; j++){ // 簡易的に、brタグを改行に var brTagStripped = messages[j].getBody().replace(/(<br>|<br />)/gi, '\n'); // 簡易的に、HTMLメールのタグを解除 var stripped = brTagStripped.replace(/(<([^>]+)>)/ig,""); var postMessage = " 件名:[" + threads[i].getFirstMessageSubject() + "]" + "本文```" + stripped + "```"; Logger.log(datetime + postMessage); // 対象のメールを1通を既読に。 messages[j].markRead(); //chatworkに通知 sendHttpPost(postMessage); } } // 対象のメールを既読にする // NOTE: 同じ件名でネストされているものはすべて既読になります。 // threads[i].markRead(); } } function sendHttpPost(message, username) { var jsonData = { "channel" : postChannel, "username" : username, "text" : message }; var payload = JSON.stringify(jsonData); var options = { "method" : "post", "contentType" : "application/json", "payload" : payload }; UrlFetchApp.fetch(apiToken, postUrl, options); }

参考URL

↓GASのコード
https://qiita.com/matsuyoro/items/187214f664148282a7af

↓chatworkのAPIトークンとルームIDの取得
https://al-batross.net/2020/09/30/chatworkapi/

参考にしたコードはGmail→slackの自動転送コードなので、chatworkに置き換えて試しています。
slackではwebhookの設定が必要になるようですが、chatworkではAPIトークンとルームIDの設定が必要になるため、そこに差分が生じています。
恐らく、この箇所に問題があるかと推測していますが、現時点では具体的な対応策が浮かんでおりません。
どなたかアドバイスいただけますと助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

自分でテストして出来たのでコードを載せておきます。
apiTokenroomIdを設定していただければチャットワークに投稿されると思います。

以下のメールのメッセージを取得するコードですが、タグなしのメッセージは**getPlainBody()**で取得ができます。

GAS

1// 簡易的に、brタグを改行に 2var brTagStripped = messages[j].getBody().replace(/(<br>|<br />)/gi, '\n'); 3 4// 簡易的に、HTMLメールのタグを解除 5var stripped = brTagStripped.replace(/(<([^>]+)>)/ig,"");

下のコードでタグなしのメッセージが取得できますので便利です。

GAS

1var plainBody = messages[j].getPlainBody();

下が自分でテストしてうまくいったコードです。

GAS

1var apiToken = "{API_TOKEN}"; 2 3var roomId = "{ルームID}"; 4 5// 抽出元のGmailのラベル 6var checkLabel = "テスト "; 7 8function myFunction() { 9 // 未読の指定ラベル を検索 10 var threads = GmailApp.search("is:unread label:" + checkLabel); 11 12 var count = threads.length; 13 Logger.log("対象件数:" + threads.length); 14 15 for (var i = 0; i < count; i++) { 16 var lastDate = threads[i].getLastMessageDate(); 17 var datetime = lastDate.getFullYear() + "/" + (lastDate.getMonth() + 1) + "/" + lastDate.getDate() + " " + lastDate.getHours() + ":" + lastDate.getMinutes() + ":" + lastDate.getSeconds(); 18 19 var messages = threads[i].getMessages(); 20 21 //同じ件名で、ネストされたメッセージを個別に 22 if (messages.length > 0) { 23 for (var j = 0; j < messages.length; j++) { 24 // 簡易的に、brタグを改行に 25 var plainBody = messages[j].getPlainBody(); 26 27 var postMessage = " 件名:[" + threads[i].getFirstMessageSubject() + "]" + "本文```" + plainBody + "```"; 28 Logger.log(datetime + postMessage); 29 30 // 対象のメールを1通を既読に。 31 messages[j].markRead(); 32 33 //chatworkに通知 34 postChatWork(postMessage); 35 } 36 } 37 38 // 対象のメールを既読にする 39 // NOTE: 同じ件名でネストされているものはすべて既読になります。 40 // threads[i].markRead(); 41 } 42} 43 44function postChatWork(message) { 45 const client = ChatWorkClient.factory({ token: apiToken }); 46 client.sendMessage({ 47 room_id: roomId, 48 body: message, 49 }); 50}

投稿2021/09/15 04:18

fake_shibe

総合スコア806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

narururu

2021/09/15 06:12

すごいですね! ありがとうございます! しかし私の環境では下記エラーとなってしまうんですよね。。 ReferenceError: messages is not defined 現在このエラーと格闘中です✊
fake_shibe

2021/09/15 06:31

messages is not definedは、messagesが定義されていないということなので、var messages = threads[i].getMessages(); が抜けている可能性があるかと思います。
narururu

2021/09/16 02:36

ありがとうございます! 無事、想定通りの挙動が確認できました! 本当に助かりました! ありがとうございます!
Taishi

2022/05/16 02:50

横からすいません!上のコードでできたのですが、すべて既読になってしまいます。 未読のまま置いておくにはどうすればいいのか教えていただけませんか?
fake_shibe

2022/05/16 11:55

Taishiさん、 // 対象のメールを1通を既読に。 messages[j].markRead(); の場所を消去してみたらどうでしょうか?
guest

0

以下のコードで特定のグループチャットに投稿できると思います。

var roomId = "テスト";

をグループチャットのルームID(数字)に設定してください。例えば以下のように、

var roomId = 123456789;

ルームIDの確認はここに載っています。

GAS

1var apiToken = "{API_TOKEN}"; 2 3// 通知したいchatworkのチャネル(部屋) 4// グループチャットのルームID (数字のようです) 以下のURLが参考になります 5// https://help.chatwork.com/hc/ja/articles/360000142942-%E3%83%AB%E3%83%BC%E3%83%A0ID%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B 6var roomId = "テスト"; 7 8// 抽出元のGmailのラベル 9var checkLabel = "テスト "; 10 11function myFunction() { 12 // 未読の指定ラベル を検索 13 var threads = GmailApp.search("is:unread label:" + checkLabel); 14 15 var count = threads.length; 16 Logger.log("対象件数:" + threads.length); 17 18 for (var i = 0; i < count; i++) { 19 var lastDate = threads[i].getLastMessageDate(); 20 var datetime = lastDate.getFullYear() + "/" + (lastDate.getMonth() + 1) + "/" + lastDate.getDate() + " " + lastDate.getHours() + ":" + lastDate.getMinutes() + ":" + lastDate.getSeconds(); 21 22 var messages = threads[i].getMessages(); 23 24 //同じ件名で、ネストされたメッセージを個別に 25 if (messages.length > 0) { 26 for (var j = 0; j < messages.length; j++) { 27 // 簡易的に、brタグを改行に 28 var brTagStripped = messages[j].getBody().replace(/(<br>|<br />)/gi, "\n"); 29 30 // 簡易的に、HTMLメールのタグを解除 31 var stripped = brTagStripped.replace(/(<([^>]+)>)/gi, ""); 32 33 var postMessage = " 件名:[" + threads[i].getFirstMessageSubject() + "]" + "本文```" + stripped + "```"; 34 Logger.log(datetime + postMessage); 35 36 // 対象のメールを1通を既読に。 37 messages[j].markRead(); 38 39 //chatworkに通知 40 sendHttpPost(postMessage); 41 } 42 } 43 44 // 対象のメールを既読にする 45 // NOTE: 同じ件名でネストされているものはすべて既読になります。 46 // threads[i].markRead(); 47 } 48} 49 50function sendHttpPost(message) { 51 const client = ChatWorkClient.factory({ token: apiToken }); 52 client.sendMessage({ 53 room_id: roomId, 54 body: message || `これはテストです。`, 55 }); 56} 57

下のコードでテスト投稿ができると思います。
apiToken と roomId を設定したら**”こんにちは”**とグループチャットに通知されると思います。

GAS

1function postChatWork() { 2 const apiToken = "{API_TOKEN}"; 3 const roomId = "{ルームID}"; 4 const message = "こんにちは"; 5 6 const client = ChatWorkClient.factory({ token: apiToken }); 7 client.sendMessage({ 8 room_id: roomId, 9 body: message, 10 }); 11}

投稿2021/09/13 18:57

fake_shibe

総合スコア806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

narururu

2021/09/14 07:15

ご回答ありがとうございます! できました!すごいです! ただ、特定のラベルに届いたGmailが自動転送されないんです。。 質問欄に記載したコードを追加しているのですが、なぜだろう。
guest

0

ちょっと見ただけですけど、function sendHttpPostにあるUrlFetchApp.fetch(apiToken, postUrl, options);がおかしいと思います。
fetchの引数は2個までで、1つ目はURLを指定して、2つ目にオプションを指定してください。
fetch(url, params)

Chatworkには便利なライブラリがあるので、そっちを使った方が楽かもしれませんね。
ライブラリのスクリプトIDは、1nf253qsOnZ-RcdcFu1Y2v4pGwTuuDxN5EbuvKEZprBWg764tjwA5fLavのようです。
以下のリンクが参考になると思います。

投稿2021/09/11 02:10

fake_shibe

総合スコア806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

narururu

2021/09/13 13:44 編集

ご回答ありがとうございます!fake_shibeさん☺ 参考になります! しかし、参考ページにはマイチャット宛てにはできますが、特定のグループチャットには送信できないですね。。。 別の解決策があるのかもしれませんが、ちょっと難しそうです。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問