チャットワークって、有料版の一番高いプランじゃないとバックアップ機能が使えないんですよね。。しかも日々新しいチャットが飛ぶので、定期的にバックアップするのも面倒なところ。
そこでオススメなのが、チャットをGmailに転送してバックアップ代わりにする方法です。
ちょっとしたプログラムが必要ですが、コピペで済むようにまとめたので、7分ほどお付き合いください。
ちなみに「Gmail をチャットワークに転送」する方法は探せばたくさん見つかりますが、その逆の「チャットワークを Gmail に転送」する情報って少ないので、Gmail に情報を一元化したい方にもご参考になるかと思います。
★更新情報
2023/01/05
・取得できるチャットメッセージは直近100件までが上限、を注意点として追記しました
2022/11/07
・メッセージだけでなく投稿ファイルも取得できるようにしました
・メッセージやファイルの投稿日時を送信メールに含めるようにしました
旧版をお使いの方は、再度ステップ2の GASのプログラムをコピペ → 「書き換える部分」の書き換え を行っていただくと最新版をご利用いただけます。
チャットをGmailに転送する3つのメリット
公式バックアップ機能と比べて、チャットをGmailに転送する方法だと
- 無料でバックアップを取れる
- 一度セットすれば放置でOK
- Gmailでチャットを検索できる
の3つのメリットがあります。
メリット1:無料でバックアップを取れる
本来は有料の「エンタープライズ」プランでしか使えないバックアップを、フリープランでも取得できるようになります。
とはいえ、チャットワークが用意してくれている公式バックアップ機能ではないため、似たような仕組みを自分で作ることになります。(詳しい方法は後述)
メリット2:一度セットすれば放置でOK
日々あたらしいチャットが飛び交うので、公式バックアップ機能だと定期的に取らないといけません。
ところがGmailへの転送であれば、毎日や1時間毎など好きなペースで自動取得できます。
メリット3:Gmailでチャットを検索できる
チャットワークにも検索機能がありますが、転送しておくことでGmail上でもチャットを検索できるようになります。
「●●の件ってチャットで送ったんだっけ?それともメールだったっけ…」と曖昧なときも、とりあえずGmailで検索すればヒットするので見つけやすくなります。
注意:取得できるチャットは直近100件が上限
チャットワークの仕様で、直近100件のチャットメッセージまで取得できます。そのため過去のチャットをすべて取得できるわけではありません。
また今回の方法では「GAS」という仕組みを活用しますが、こちらも「一日に送信できるメールは100通まで」という制限があります。
チャットをGmailに転送し始めれば、今後のメッセージは取りこぼしなく取得できますので、1日でも早く仕組みを動かしておくのがオススメです。
ほぼコピペでOK。API と GAS でチャットを自動転送する方法
それでは、実際にチャットをGmailに転送する仕組みをつくっていきましょう。
流れとしては次の2ステップです。
- チャットワークのAPIトークンを取得する
- GAS(Google App Script)でプログラムを動かす
ステップ1:チャットワークのAPIトークンを取得する
まずはチャットワークの「APIトークン」を手に入れます。
APIトークンとは、API(外部からシステムを操作する仕組み)を使うための鍵のようなモノになります。
▼APIトークン発行ページ を開いて、チャットワークのパスワードを入力します。
(チャットワークにログインしていない場合は、先にログイン画面が出ると思うので、まずはログインしてください)
▼APIトークンが表示されます。あとで必要になるので、このまま画面を残しておきます。
ちなみに、APIトークンはパスワードのようなものなので、他人に教えたりしないように管理してください。
ステップ2:GAS(Google App Script)でプログラムを動かす
チャットワークを外から操作できるようになる鍵が手に入ったので、次は操作するためのプログラムを用意します。
今回は、Googleアカウントを持っていれば無料で使える「GAS(Google App Script」というサービスを使ってプログラムを動かします。
プログラムを用意する
▼GAS のページを開いて Starg Scripting をクリックします。
▼新しいプロジェクト をクリックします。
▼プログラムを入力する画面になります。まずは最初からあるプログラムを消してまっさらにします。
▼次のテキストをすべてコピーして、さきほど文字を消した部分にペースト(貼り付け)します。
// 必要な情報を設定 const chatworkToken = '書き換える部分①'; //チャットワークのAPIトークン const mailFrom = '書き換える部分②'; //通知を送るEメールアドレス const mailTo = '書き換える部分③'; //通知を受けるEメールアドレス const folderID = '書き換える部分④' // 投稿されたファイルの保存先となるGoogleドライブのフォルダID const apiBaseUrl = 'https://api.chatwork.com/v2'; // チャットワークAPIのベースURL // メッセージ(またはファイル)を転送 function noticeChatworkMessage(){ // チャット一覧を取得 let rooms = []; const params = { headers : {"X-ChatWorkToken" : chatworkToken}, method : "get" }; var response = UrlFetchApp.fetch(`${apiBaseUrl}/rooms`, params); if (response == "") return false; for (var value of JSON.parse(response.getContentText())) { rooms.push({ 'id' : value.room_id, 'name' : value.name }); } // チャットごとにメッセージ・ファイルを取得 let data = []; for (var room of rooms) { // メッセージを取得 var content = UrlFetchApp.fetch(`${apiBaseUrl}/rooms/${room.id}/messages`, params).getContentText(); if (content != '') { for (var value of JSON.parse(content)) { // 結果を保持 data.push({ 'room' : room, 'type' : 'message', 'time' : value.send_time, 'value' : value }); console.log(data.slice(-1)[0]); } } // ファイルを取得(Googleドライブの保存先フォルダIDが指定されている場合のみ) if (folderID != '') { // まずはファイル一覧を取得 var contentFileList = UrlFetchApp.fetch(`${apiBaseUrl}/rooms/${room.id}/files`, params).getContentText(); if (contentFileList != '') { for (var fileList of JSON.parse(contentFileList)) { // ファイル保存先のGoogleドライブのフォルダにルーム毎のフォルダを作成(すでにある場合はそのまま) const baseFolder = DriveApp.getFolderById(folderID); let folder; if (baseFolder.getFoldersByName(room.name).hasNext()){ folder = baseFolder.getFoldersByName(room.name).next(); } else { folder = baseFolder.createFolder(room.name); } // すでに同名のファイルがある場合はスキップ(メッセージと違って毎回全件取得するため) const existFiles = folder.getFiles(); var flg = false; while (existFiles.hasNext()) { if (existFiles.next().getName() == fileList.filename) { flg = true; break; } } if (flg) continue; // ファイルのダウンロードURLを取得 var responseFileUrl = UrlFetchApp.fetch(`${apiBaseUrl}/rooms/${room.id}/files/${fileList.file_id}/?create_download_url=1`, params); const fileUrl = JSON.parse(responseFileUrl.getContentText()); // ファイルをダウンロード const file = UrlFetchApp.fetch(fileUrl.download_url).getBlob().setName(fileList.filename); // ファイルを保存 & ファイルのURLを取得 const driveFileUrl = folder.createFile(file).getUrl(); // 結果を保持 data.push({ 'room' : room, 'type' : 'file', 'time' : fileList.upload_time, 'value': fileList, 'name' : fileList.filename, 'url' : driveFileUrl }); console.log(data.slice(-1)[0]); } } } } // 取得したメッセージ・ファイルを時系列に並び替え data.sort((a, b) => a.time - b.time); // 取得したメッセージ・ファイルをメール送信 for (var dataValue of data) { // メールのタイトル let mailSubject = `【Chatwork転送】${dataValue.value.account.name}からのメッセージ`; // メール本文 let mailBody = ""; mailBody += `【${dataValue.room.name}】\n`; mailBody += `送信日時:${timestampToDate(dataValue.time)}\n`; mailBody += `${dataValue.value.account.name}より:\n`; mailBody += "------------------\n"; if (dataValue.type == 'message') { mailBody += `${dataValue.value.body}\n`; } else if (dataValue.type == 'file') { mailBody += `${dataValue.name}\n`; mailBody += `${dataValue.url}\n`; } mailBody += "------------------\n"; mailBody += 'https://www.chatwork.com/#!rid'+dataValue.room.id; GmailApp.sendEmail( mailTo, mailSubject, mailBody, { from : mailFrom, name : "チャットワーク", } ); } console.log(`本日の残りメール送信可能数:${MailApp.getRemainingDailyQuota()}/100通`); } // タイムスタンプを日時に変換 function timestampToDate (timestamp) { let date = new Date(timestamp * 1000); // ミリ秒→秒の調整 let result = date.getFullYear(); result += '/'; result += `0${date.getMonth() + 1}`.slice(-2); result += '/'; result += `0${date.getDate()}`.slice(-2); result += ' '; result += `0${date.getHours()}`.slice(-2); result += ':'; result += `0${date.getMinutes()}`.slice(-2); result += ':'; result += `0${date.getSeconds()}`.slice(-2); return result; }
▼貼り付けたら、2~5行目の「書き換える部分」を次のように書き換えます。
注意点としては、「’」の記号は消さないで、’ と ‘ で文字を囲うように書き換えます。
書き換える部分① | チャットワークのAPIトークン |
書き換える部分② | 自分のGmailアドレス |
書き換える部分③ | 自分のGmailアドレス |
書き換える部分④ | 投稿ファイルを保存する先のGoogleドライブのフォルダID (詳細は下記↓) |
書き換える部分④ を指定すると、メッセージだけでなく投稿ファイルもバックアップすることができます。投稿ファイルを自動的にGoogleドライブにコピーしつつ、メールで通知が来ます。
(ファイルは不要でメッセージだけ欲しい場合は、「書き換える部分④」という文字を消して空っぽにしてください)
Googleドライブで適当なフォルダを用意したら、そのフォルダを開いた状態でURL(アドレスバー)にある
・・・/folders/●●●●●
の●●●部分をコピーして 書き換える部分④ に貼り付けます。
▼こんな感じになればOK
APIトークンを書いたら、表示したままだったチャットワークの画面は閉じてOKです。
▼書き換えができたら、フロッピーアイコン(保存) をクリックして保存します。
▼これでプログラムの用意ができたので、ちゃんと動くか一度テストしてみましょう。
実行 をクリックします。
▼ここでセキュリティの警告が出るかと思いますので、アカウント選択 → 詳細 → 無題のプロジェクト(安全ではないページ)に移動 → 許可 とクリックしていきます。
▼
▼
▼
▼下の方にこんなふうにメッセージが出ればOKです。そして Gmail に過去のチャットの内容が届いていると思います。
※もしエラーになったら、もう一度 プログラムを丸ごとコピペ → APIトークン等を書き換え を試してみてください。
タイマーをセットする
プログラムが用意できたので、10分置きなど決まったタイミングで自動でプログラムを実行するようにタイマーをセットします。
▼左側の 目覚まし時計アイコン(トリガー) をクリックします。
▼トリガーを追加 をクリックします。
▼下記①の部分で「プログラムを繰り返し実行する間隔」を選んで 保存 をクリックします。
もし最短の1分間隔とかにしても、一度Gmailに転送したチャットは2回目からは転送されないので、毎回同じメールが大量に届くという心配はありません。
下の例では、1時間おきに自動でプログラムを実行します。
▼これでトリガー(自動実行タイマー)がセットされました。
▼さいごに、今回つくった「プログラム+実行タイマー」に分かりやすい名前を付けておきましょう。
「無題のプロジェクト」の部分をクリックすると名前を変えられます。
以上でチャットワークを自動でGmailに転送する仕掛けが完成です。
おつかれさまでした!
なお、GASのページ からタイマーの実行間隔などを後から変えられるので、調整が必要になったらアクセスしてみてください。
今日から放ったらかしでチャットをバックアップしよう
API と GAS という2つの仕組みを使うことで、1円もかけずに全自動でチャットワークをGmailに転送する方法をご紹介してきました。
バックアップのみならず、Gmail上でチャットの内容を検索できたりと便利になりますので、ぜひお試しください。
参考記事
コメント
こちらのバックアップ方法を利用させていただいております。
チャットワーク上の送信日時(投稿日時)を含めることは可能でしょうか?
お忙しいところ恐れ入りますが、ご回答を宜しくお願いいたします。
松さま
この記事を参考にしていただきありがとうございます!
投稿日時を含めるようプログラムを変えてみました。
お手数ですが、プログラム部分を丸ごとコピペ → 書き換え部分の書き換え → 保存 を再度試してみていただけますでしょうか。
また、メッセージだけでなく投稿されたファイルもバックアップできるようしにしたので、ぜひご活用ください。
広瀬様、お世話になっております。
新たなコードで試したところ、投稿日時を含み正常に稼働しております。
また、ファイル保存機能を追加いただいたことで、まさしく理想のツールとなりました。
このような素晴らしいツールを無償でご提供いただき、感謝いたします。
ありがとうございました。
ちゃんと動いているようで良かったです!
ツールそのものではなく、ツールの作り方をご紹介しているに過ぎないので、ご自身で手を動かせる方に役立つ情報をこれからも発信していきたいと思います^^
こちらのバックアップを利用させていただきたいと思いやってみたのですが、”Exceeded maximum execution time”となりメールも届かない状況です。ファイルのGoogleドライブへのアップはできています。ネットでいろいろとこの”Exceeded maximum execution time”について調べてやってみてはいるんですがうまくいきません。なにかアドバイスいただけるとたすかります。
河合さま
うまく動かないとのことで、お知らせいただきありがとうございます。
”Exceeded maximum execution time” ですが、本記事で採用している「GAS」という仕組みの制限に引っかかっているようで、具体的には処理時間が長すぎて途中で終了してしまっているようです。
処理時間を短くすれば解決するかもしれないので、下記をお試しいただけないでしょうか。
▼試してほしいこと1
チャットメッセージとファイルの両方をバックアップされている場合は、試しにチャットメッセージのみバックアップしてみて下さい。
具体的には
・ステップ2で登場するプログラムの5行目を const folderID = ”; にする
・ステップ2で登場するプログラムの33行目の /messages`, の部分を /messages?force=1`, にする
としてプログラムを実行してみて下さい。
メッセージのみのバックアップだと ”Exceeded maximum execution time” とならずメールも届く場合は、上記変更を戻して「試してほしいこと2」をお試しください。
▼試してほしいこと2
「ファイルのGoogleドライブへのアップはできています」についてですが、すべてのファイルを取得できていそうでしょうか?それとも一部のファイルのみ取得できている状況でしょうか?
もし後者の「一部のファイルのみ」の場合、プログラムを実行 → ”Exceeded maximum execution time” となって終了 を何度か繰り返すことで、そのうちすべてのファイルを取得しきれる可能性があります。
一度すべてのファイルを取得しきれば、その次からはプログラムの実行時間が短くなるはずなので、エラーが消えるかもしれません。
そうではなく前者の「すべてのファイルを取得できていそう」であれば、ちょっと話は変わってきますが…。
上記で解決されない場合は、お手数ですが再度コメントいただけますでしょうか。
広瀬さま
ご丁寧な返信ありがとうございました。
まず1を実行してみましたところ、メールが届きました!
が、100通を超えていて途中で止まりましたw
そしてご指摘の通りGoogleドライブへのファイルのアップは全てではなく「一部のファイルのみ」ですので
2を実行しております。かなりログの量、ファイルの数、容量ともに多いため時間かかりそうですが、「すべてのファイルを取得」できるまでトライしてみますね。
河合さま
さっそくお試しいただきありがとうございます!
すべてのファイルを取得しきれば、以降は”Exceeded maximum execution time”とならずに動くと思いますので、ぜひトライし続けていただければと思います。
また今回の件を通して私も分かったことがありまして、本記事の方法では直近100件のメッセージしか取得できないことが判明しました。
日常的にバックアップを取っていただければ問題ありませんが、初回のバックアップでは100件より過去のメッセージを取得できません。
せっかく参考にしていただいたのに、重大な制限を見逃しており申し訳ございませんでした。
広瀬さま
はい、がんばってトライし続けます!
ちなみにメールについてですが、こちら取れているメールを見る限り過去古いメッセージから100件取れているように見えます。(メッセージの送信日時が2019年のものから取れているようです。)
またメールも100件ではなく、実際には900件以上のメールが届いていました。
河合さま
そうなんですね!またまた情報いただきありがとうございます。
何はともあれ、過去のメッセージも取れてるのなら良かったです^^
突然のご連絡失礼いたします。
チャットワークのログを取得するため本記事を試しておりましたが上手くいかず、お手数ですが、ご教示いただけますでしょうか。
【質問内容】
・添付ファイルはGoogleドライブに保存されましたが、チャット本文がGoogleドライブに保存されず、またメールも届きません。
チャット本文を取得する方法をご教示いただけませんでしょうか。
【経緯】
・記事にあるコードを実行。
・途中でタイムアウトしたため終了するまで何度も再実行し、おそらくすべての添付ファイルがGoogleドライブに取得されたことを確認。
・しかし、Googleドライブにチャット本文がなく、またメールが届きませんでした。
・他の方のコメントで回答されていた『5行目を const folderID = ”; にする』および『33行目の /messages`, の部分を /messages?force=1`, にする』を行いして再度実行。
・実行途中に『エラー Exception: Gmail operation not allowed. : Mail service not enabled noticeChatworkMessage @ コード.gs:127』が表示され止まる。
・このタイミングで私がコードに記載した書き換える部分②と③のアドレスがYahoo!アドレスで、記事にはGmailアドレスと書かれていたことに気付く。
・書き換える部分②と③をYahoo!アドレスからGmailアドレスに変更。
※Yahoo!アドレスの時も修正後のGmailアドレスの時も同じアドレスを②と③に入力。
・再度実行するも同様のエラーが発生。
以上、正月のお忙しいところお手数ですが、ご教示いただけましたら幸いです。
くれない さま
詳細な状況ありがとうございます。
まず2点ご説明したい部分があります。
・本記事でご紹介している方法では、チャット本文はGoogleドライブに保存されるのではなく、Gmailにメールとして届きます
・エラーメッセージの内容は「メール送信が許可されていません」という意味になります
上記を踏まえたうえで、ステップ2をもう一度やり直してみていただけないでしょうか。(GASで新しいプロジェクトを改めて作る)
GASプロジェクトの状態がおかしくなっている可能性がありまして、作り直すのが確実と思われます。
なお、ステップ2をやり直すにあたって次の点に注意しつつ進めてみてください。
・はじめからプログラム33行目の /messages`, の部分を /messages?force=1`, にする
・途中で動作テストを行いますが、その際に「▼ここでセキュリティの警告が出るかと思いますので・・・」の許可の画面が出てくるかどうか要確認
(ここで許可の操作をしないと正常に動かないので)
これで無事にチャットの内容がGmailに届いていればOKとなりますので、プログラム33行目を元に戻して、はじめに作ったGASプロジェクトを削除してください。
上記お試しいただいてもメールが届いていなかったりエラーメッセージが出ているようであれば、お手数ですが再度コメントいただけますでしょうか。
広瀬様
対応方法をご教示いただき、ありがとうございます。
ご教示いただきました通りステップ2からやり直しをしましたところ、『Exception: Service invoked too many times for one day: email. noticeChatworkMessage @ コード.gs:127』というエラーが表示されました。
しかし、Gmailを確認するとメールが届いており、下記のような状況です(時系列順)
・メールが100通だけ届いた
・チャットワークにはいくつかのグループがあるのですが、グループ内の一部の本文が飛ばされており届いていない
・プログラム33行目を『/messages`』に変更し再度実行したところ、ログにはエラーが出ず実行完了となっておりましたが、ログ内の実行完了の上に『本日の残りメール送信可能数:-1/100通』と記載されており、メールが届かない
※念のためもう一度実行すると、今度は『本日の残りメール送信可能数:0/100通』になる
・何度実行してもメールは届かない
・トークンの再発行をして書き換え再実行するもメールは届かず
・何度か再実行するも結果のたびに『-1/100』および『0/100』というログが交互に切り替わって表示される
なお、やり直しにあたって下記の対応および確認をしております。
・folderIDの”内は空にしている
・はじめからプログラム33行目を『/messages?force=1`』に変更
・許可の画面が出ることを確認
また、最初の実行時はメール1通につき1メッセージだけが記載されておりましたが、そういう仕様ということでよろしいでしょうか?(本文を探す際にメールを1通ずつ開くのは手間だと思ったため)
以上、お手数ですが、ご確認のほどよろしくお願いいたします。
くれない さま
早速お試しいただきありがとうございます。
メールが届いたとのことで、ひとまず前進してよかったです!
エラーメッセージからすると「メールを送信し過ぎ」という内容ですので、おそらく上限に引っかかっているものと思われます。
本記事の注意点でも挙げておりますが、この仕組みで採用しているGASには ”1日に送信できるメールは100通まで” という制限がございます。
明日になればまたメール送信できるかと思いますので、お手数ですが明日改めて実行してみていただけますでしょうか。
(制限のリセットが日本時間なのか海外なのかちょっと曖昧でして、日付をまたいですぐにはリセットされないかもしれません)
ここで不確定情報になってしまいますが、チャットのメッセージが大量にある場合は古いものから100通ずつ取得できるようです。
あす再度実行いただき、本日取得いただいた100通の続きから取得できるようであれば、数日間に渡って実行いただくことですべてのメッセージを取得できるかと思います。
一方、チャットワークの公式情報を見る限りではどうも「直近の100通のメッセージを取得可能」と読み取れまして、もし続きから取得できなかった場合は申し訳ありませんが本仕組みの限界となってしまいます。
「グループ内の一部の本文が飛ばされており届いていない」とのご指摘は、もしかしたらこの辺りの制限が影響しているかもしれません。
>最初の実行時はメール1通につき1メッセージだけが記載
はい、こちらは仕様になります。
プログラムの組み方次第になりますが、GASのもう1つの制限に ”プログラムの実行は5分以内” というものがありまして、現行ではなるべく細切れに動くようにしています。
広瀬様
色々とご教示いただき、ありがとうございます。
1日の取得上限数が100件とのこと承知いたしました。
明日改めて実行し、続きから取得できるか確認いたします。
広瀬様
お世話になっております。
本日改めて実行したところ、続きからではなく本日のメッセージだけがGmailに届きました。
昨日実行した時は、最後に届いたメールには12月3日のメッセージが記載されておりましたが、本日実行すると1月3日(本日)のメッセージから始まりました。(実際、その間にも色々なメッセージのやり取りはありました)
本日はチャットワークで16通のやり取りがあり、ログを見ると『本日の残りメール送信可能数:84/100通』となっておりました。
そのため、本日分の取得だけで見たら正常なのですが、昨日からの続きという意味では上手くいかなかったようです。
以上、よろしくお願いいたします。
くれない さま
その後の結果を共有いただきありがとうございます。
どうもチャットワーク公式情報(直近100件まで)と状況が合致しないため、うまくやれば100件より前の過去分も取れたりする可能性がありそうですが、現状では詳細不明です。
せっかく本仕組みをお試しいただいたのに申し訳ありませんが、過去分ではなく今後のチャットメッセージを保管するツールとして活用いただけますと幸いです。
また「直近100件が上限」を本文に注意点として追記させていただきました。
過去メッセージを一括取得できるツールではない、と初めからお伝えできておらず申し訳ありませんでした。
広瀬様
いろいろとご教示いただき、ありがとうございました。
また、直近100件だけとはいえログを残せるのは凄く助かります。
むしろこういった情報を無料で公開いただき感謝しかございません。
今後は前回から新規メッセージが100件を超える前にログを取っていこうと思います。
この度は本当にありがとうございました。
くれない さま
こちらこそ本記事を活用いただきありがとうございます!
記事もプログラムも、せっかく書いたものなので誰かのお役に立てば嬉しく思います。
またこの度はプログラムのテストもご協力いいただいた形となり、おかげて直近100件までの制約を明確にすることができ感謝いたします。
こちらこそありがとうございました。