Slackのpublic channelに投稿された画像をGoogle Driveへ保存するGoogle Apps Script botです。
-
Node.jsを用意して依存を入れる。
npm install
claspはグローバルインストールした方がいいかも
npm install @google/clasp -g
-
src/ディレクトリに移動した後、Apps Script APIを有効にし、claspにログインする。
cd src clasp login -
初回だけApps Scriptプロジェクトを作る。
clasp create
既存プロジェクトを使う場合はcloneする。
clasp clone -- SCRIPT_ID
SCRIPT_IDはApps Scriptエディタの「プロジェクトの設定」にあるスクリプトID。どちらの方法でも、成功するとリポジトリ直下にローカル用の.clasp.jsonが作られる。 -
Apps ScriptのScript Propertiesに以下を設定する。
SLACK_BOT_TOKEN: Slack Bot User OAuth Token(xoxb-で始まるやつ)DRIVE_ROOT_FOLDER_ID: 保存先の親Google DriveフォルダID
-
Apps Scriptへ反映してWeb Appとしてデプロイする。デプロイURLは
/execで終わるWeb App URLを使う。clasp push clasp deploy
最初のdeployだと、コマンドだとGoogle Driveへの操作を承認する作業を通らないので、ブラウザの方のGASから手動でデプロイを行う必要があるかも
デプロイを解除する場合は以下のコマンドを実行し、デプロイ解除するデプロイIDを選択することで解除できる
clasp undeploy # あらかじめデプロイ解除するデプロイIDが分かっている場合は以下のコマンドでも可能 clasp undeploy デプロイID -
Slack AppのEvent SubscriptionsでRequest URLにWeb App URLを設定する。
botの管理画面:https://api.slack.com/apps/A0ATB9M887J/general?
- Bot Event:
file_shared,message.channels - Bot Token Scopes:
files:read,channels:read,channels:history - 対象public channelへBotを参加させる
- scopeを追加した場合はSlack Appを再インストールする
Request URL検証で
challenge_failedが出る場合は、clasp:push後に新しいWeb Appデプロイを作り、その/execURLを設定しているか確認する。 - Bot Event:
- 保存対象はSlackの
mimetypeがimage/で始まるファイルだけです。 - 1回の投稿に複数画像が含まれる場合は、画像ごとに保存します。
- 保存先は
45th(2025/10/1~)/channel-name/の形式です。 - チャンネル名の半角カタカナはGoogle Driveフォルダ作成時に全角カタカナへ変換します。
- 2026/10/1以降は
46th(2026/10/1~)/channel-name/になります。 - ファイル名は
yyyyMMdd-HHmmss_<slackFileId>_<originalName>です。 - Slack retryによる二重保存を避けるため、保存処理は排他制御し、同じSlack file IDは短時間スキップします。
npm run check
npm run clasp:create
npm run clasp:clone -- SCRIPT_ID
npm run clasp:push
npm run clasp:deploy
npm run clasp:open