はじめに (対象読者・この記事でわかること)

この記事は、Google Apps Script(GAS)を少し触ったことがあり、ChatWorkを業務で利用している方を対象にしています。 この記事を読むことで、ChatWorkの特定のルームにある添付ファイルを自動的に検出し、Googleドライブにまとめて保存するスクリプトの作成方法がわかります。また、GASのトリガー機能を使って定期的にスクリプトを実行する方法も学べます。 特に、チームで共有するチャットルームに頻繁にファイルがアップロードされる環境で、手動でファイルを保存する手間を省きたい場合に役立つ内容です。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 前提となる知識1: Google Apps Scriptの基本的な知識 前提となる知識2: ChatWork APIの基本的な使い方 前提となる知識3: Googleドライブの基本的な操作

ChatWorkの添付ファイル管理の必要性

チームでのコミュニケーションにChatWorkを利用している環境では、チャットルームにファイルが頻繁にアップロードされることがあります。特に、設計書や仕様書、報告書など重要なドキュメントがチャット経由で共有される場合、これらのファイルを一元的に管理しておくことは重要です。

しかし、ChatWorkのUI上ではファイルの検索や整理が限定的であり、時間が経つと必要なファイルを見つけるのが困難になることがあります。また、チャットの履歴が長くなると、過去に共有されたファイルを見つけるためにはスクロールが必要になり、効率的ではありません。

このような課題を解決するために、Google Apps Script(GAS)を使ってChatWorkの特定のルームにある添付ファイルを自動的に検出し、Googleドライブにまとめて保存するスクリプトを作成する方法を解説します。これにより、重要なファイルを時系列で整理・保存し、後から容易にアクセスできるようになります。

GASによるChatWork添付ファイルの自動保存スクリプトの実装

それでは、実際にGASを使ってChatWorkの添付ファイルをGoogleドライブに保存するスクリプトを実装していきましょう。ここでは、特定のChatWorkルームにアップロードされた添付ファイルを自動で検出し、Googleドライブに保存する処理を実装します。

ステップ1: ChatWork APIの準備

まず、ChatWork APIを利用するための準備を行います。

  1. ChatWorkの設定画面からAPIトークンを発行します。
  2. 発行されたAPIトークンは安全な場所に保存してください。

ステップ2: Google Apps Scriptプロジェクトの作成

  1. Googleドライブにアクセスし、「新規」→「その他」→「Google Apps Script」を選択します。
  2. プロジェクト名を「ChatWorkファイル自動保存」など分かりやすい名前に変更します。

ステップ3: 必要なライブラリのインポート

ChatWork APIを呼び出すために、UrlFetchAppライブラリを使用します。このライブラリはデフォルトで利用可能です。

ステップ4: スクリプトの実装

以下に、ChatWorkの特定のルームにある添付ファイルをGoogleドライブに保存するスクリプトの全体を示します。

Javascript
// 設定項目 const CHATWORK_API_TOKEN = 'ChatWork_APIトークンをここに設定'; // ChatWork APIトークン const TARGET_ROOM_ID = '対象のルームIDをここに設定'; // 対象のChatWorkルームID const DRIVE_FOLDER_ID = 'GoogleドライブのフォルダIDをここに設定'; // ファイルを保存するGoogleドライブのフォルダID // メイン処理 function saveChatWorkFiles() { try { // ChatWork APIからメッセージを取得 const messages = getChatWorkMessages(); // メッセージから添付ファイルを抽出 const attachments = extractAttachments(messages); // Googleドライブにファイルを保存 saveFilesToDrive(attachments); // 完了メッセージを表示 Logger.log('処理が完了しました。'); } catch (e) { Logger.log('エラーが発生しました: ' + e.toString()); } } // ChatWork APIからメッセージを取得 function getChatWorkMessages() { const url = 'https://api.chatwork.com/v2/rooms/' + TARGET_ROOM_ID + '/messages?force=0'; const options = { 'method': 'get', 'headers': { 'X-ChatWorkToken': CHATWORK_API_TOKEN }, 'muteHttpExceptions': true }; const response = UrlFetchApp.fetch(url, options); const json = JSON.parse(response.getContentText()); if (response.getResponseCode() !== 200) { throw new Error('ChatWork APIの呼び出しに失敗しました: ' + json.errors[0].message); } return json; } // メッセージから添付ファイルを抽出 function extractAttachments(messages) { const attachments = []; for (const message of messages) { if (message.type === 'message' && message.message.includes('[file]')) { // メッセージから添付ファイル情報を抽出 const fileMatches = message.message.match(/\[file:(\d+)\]/g); if (fileMatches) { for (const match of fileMatches) { const fileId = match.match(/\[file:(\d+)\]/)[1]; const fileUrl = 'https://api.chatwork.com/v2/rooms/' + TARGET_ROOM_ID + '/files/' + fileId; attachments.push({ 'id': fileId, 'url': fileUrl, 'name': message.message.split('[/file]')[0].split(']').pop().trim(), 'uploadTime': message.send_time }); } } } } return attachments; } // Googleドライブにファイルを保存 function saveFilesToDrive(attachments) { const folder = DriveApp.getFolderById(DRIVE_FOLDER_ID); for (const attachment of attachments) { try { // ファイルをダウンロード const options = { 'method': 'get', 'headers': { 'X-ChatWorkToken': CHATWORK_API_TOKEN }, 'muteHttpExceptions': true }; const response = UrlFetchApp.fetch(attachment.url, options); if (response.getResponseCode() === 200) { // ファイル名にアップロード日時を追加 const fileName = attachment.name + '_' + Utilities.formatDate(new Date(attachment.uploadTime * 1000), 'JST', 'yyyyMMdd_HHmmss'); // Googleドライブにファイルを保存 const blob = response.getBlob(); folder.createFile(blob).setName(fileName); Logger.log('ファイルを保存しました: ' + fileName); } else { Logger.log('ファイルのダウンロードに失敗しました: ' + attachment.name); } } catch (e) { Logger.log('ファイルの保存中にエラーが発生しました: ' + attachment.name + ' - ' + e.toString()); } } }

ステップ5: スクリプトの実行

  1. GASエディタで上記のコードをコピー&ペーストします。
  2. 設定項目の部分を、実際の環境に合わせて変更します。
  3. 「保存」ボタンをクリックしてスクリプトを保存します。
  4. 実行ボタン(▶)をクリックしてスクリプトを実行します。初回実行時は権限の承認が必要です。

ステップ6: トリガーの設定

定期的にスクリプトを実行するために、トリガーを設定します。

  1. エディタの左側の時計アイコン(トリガー)をクリックします。
  2. 「トリガーを追加」をクリックします。
  3. 以下のように設定します。 - 実行する関数: saveChatWorkFiles - イベントの種類: 時間主導型 - 時間ベースのトリガーのタイプ: 日付ベースのタイマー - 時刻: 午前2:00
  4. 「保存」ボタンをクリックします。

これで、毎日午前2時にChatWorkの指定したルームにある添付ファイルがGoogleドライブに自動保存されるようになります。

ハマった点やエラー解決

エラー1: ChatWork APIの呼び出しに失敗する

症状: ChatWork APIを呼び出す際に、401エラー(認証エラー)や403エラー(アクセス禁止)が発生する。

原因: - APIトークンが不正または期限切れ - ルームIDが不正 - APIトークンに権限がない

解決策: 1. ChatWorkの設定画面でAPIトークンが正しく発行されているか確認します。 2. 対象のルームIDが正しいか確認します。 3. APIトークンの権限に「ファイルの読み取り」が含まれているか確認します。

エラー2: Googleドライブへの保存に失敗する

症状: Googleドライブにファイルを保存しようとすると、権限エラーが発生する。

原因: - 指定したフォルダIDが不正 - フォルダへの書き込み権限がない

解決策: 1. フォルダIDが正しいか確認します。フォルダIDは、GoogleドライブのURLの「folders/」以降の部分です。 2. スクリプト実行ユーザーが対象のフォルダに書き込み権限を持っているか確認します。

エラー3: 添付ファイルの抽出に失敗する

症状: 添付ファイルが正常に抽出されない。

原因: - メッセージのフォーマットが想定と異なる - 正規表現が適切でない

解決策: 1. ChatWorkのメッセージフォーマットが想定通りか確認します。 2. 正規表現を調整して、添付ファイル情報を正しく抽出できるようにします。以下に正規表現の例を示します。

Javascript
// より堅牢な添付ファイル抽出用正規表現 const fileMatches = message.message.match(/\[file:(\d+)\][\s\S]*?\[\/file\]/g);

まとめ

本記事では、GASを使ってChatWorkの添付ファイルをGoogleドライブに自動保存するスクリプトの作成方法を解説しました。

  • ChatWork APIとGoogle Apps Scriptを連携させる方法
  • 添付ファイルの抽出とGoogleドライブへの保存処理の実装
  • スクリプトの定期実行のためのトリガー設定

この記事を通して、ChatWork上のファイルを効率的に管理するための自動化手法を学ぶことができたと思います。これにより、手動でのファイル管理の手間を省き、重要なドキュメントを確実に保存・整理できるようになります。

今後は、保存したファイルの重複チェック機能や、特定の条件でファイルを整理する機能など、さらに高度な自動化機能の追加も検討していきたいです。

参考資料