📁

GASでGoogleDriveへのファイルのアップロードをDiscordBotに通知する

2022/09/26に公開

はじめに

Discordを使ってチーム開発を行う中で、GoogleDriveへのファイルアップロードをDiscordに通知したくなったので、GASに挑戦しました。

指定フォルダ階層へのファイルのアップロードをDiscordに通知することは、
IFTTT参考サイトの方法を利用して実現できました。
しかし、これらは指定フォルダ直下へのファイルのアップロードしか通知できません。

そこで、指定フォルダ以下のどのフォルダ階層にファイルがアップロードされても通知できるようなGASを作成しました。
メモがてら残しておきます。

GASの実装

早速GASを実装します。
1分毎に再帰的にフォルダ内のファイルを確認して、新しくアップロードされたものあればDiscordに通知します。

function myFunction() {
    // 基準となる時間
    const now = new Date();

    // 対象のGoogle Driveの対象フォルダIDを指定
    const root = DriveApp.getFolderById('/**** 対象のGoogleDriveフォルダのID ****/');

    // rootフォルダから調査開始
    scanFolder(root, now);
}

// 指定フォルダ内の調査
function scanFolder(rootFolder, now) {

    // フォルダ内のファイル一覧を取得
    const files = rootFolder.getFiles();

    // files内で最近作成されたものを探してDiscordに送信
    judgeFile(files, now);

    // フォルダ内のフォルダ一覧を取得
    const folders = rootFolder.getFolders();

    // それぞれのフォルダについてscanFolderを実行
    while (folders.hasNext()) {
        const folder = folders.next();
        scanFolder(folder, now);
    }
}

// アップロード時間を判定
function judgeFile(files, now) {

    // すべてのファイルについてアップロード時間を判定
    while (files.hasNext()) {
        const file = files.next();
        // ファイルの作成(アップロード)時間を取得
        const createDate = file.getDateCreated();
        // 分単位で差分を計算
        const timeDiff = (now.getTime() - createDate.getTime()) / (60 * 1000);

        // 1分以内に作成されたファイルだったとき
        if (1 >= timeDiff) {
            // Log出力
            Logger.log(file.getName());
            // Discordに送信
            sendDiscord(
                [{
                    "title": "新しいファイルがアップロードされました",
                    "color": 1127128,
                    "fields":
                        [{
                            "name": "ファイル名",
                            "value": file.getName()
                        },
                        {
                            "name": "URL",
                            "value": file.getUrl()
                        }]
                }]
            )
        }
    }
}

function sendDiscord(embeds) {
    const webhookUrl = '/**** DiscordBotのWebhookURL ****/';

    const username = 'GoogleDrive';
    const jsonData = {
        "username": username,
        "embeds": embeds
    };

    const payload = JSON.stringify(jsonData);
    const options = {
        "method": "post",
        "contentType": "application/json",
        "payload": payload
    };

    UrlFetchApp.fetch(webhookUrl, options);
}

sendDiscord()へ渡しているembedsの内容を編集するとBotメッセージの見た目を調整できます。以下のサイトが参考になりました。
https://birdie0.github.io/discord-webhooks-guide/structure/embeds.html

情報入力

情報の入力が必要な箇所を埋めます。

DiscordBotのWebhookURL

通知したいテキストチャンネルの チャンネルの編集 -> 連携サービス からWebhookを作成しURLをコピーします。

対象のGoogleDriveフォルダのID

監視したいフォルダのURLのidの部分をコピーします。
.../folders/{id}の{id}の箇所です。

動かしてみる

実際に動かしてみます。
Webアプリとしてデプロイして、トリガーで1分毎にmyFunction()が実行されるようにします。

適当なファイルを監視しているフォルダにアップロードしてみてください。

のように表示されていたら成功です。

おわりに

ファイル数が増えると動作が遅くなってそのうち実行時間制限に引っ掛かりそうですが、それまでは使っていこうと思います。
Discordで表示されたときにプレビューが出るようにするのは、GoogleDriveの共有範囲が関係するようなので断念しました。

至らない点もあるかと思いますが、コメント等で指摘していただけると嬉しいです。

それでは、よいDiscordチーム開発を!

参考

コードの参考にさせていただきました。
https://www.vamp.jp/archives/350

取得できるファイルの詳細が列挙されています。
最近更新されたファイルを通知するBotも作れそうですね。
https://tetsuooo.net/gas/42/

Githubのbotの作り方がいろいろ書いてあります。
今回はembedsの使い方でお世話になりました。
https://birdie0.github.io/discord-webhooks-guide/structure/embeds.html

GitHubで編集を提案

Discussion