GASでDiscordにGoogleDrive変更通知を飛ばす

# 概要

GoogleDriveの変更通知をDiscord Webhookで通知する機能の作成

Google App Script (以下gasと表記する)を利用し、定期的に処理を実行する事で変更履歴を監視し更新があった場合通知する

- Google App Scriptとは
    
    Googleが提供しているサービス(Google Driveやスプレッドシートなど)を操作したり、拡張することが出来る機能
    
    .gs という拡張子を利用する、書式はJavaScript
    
https://developers.google.com/apps-script/overview?hl=ja
    

# 環境構築

gasはブラウザ上のgas管理画面上でコーディングする事は可能だが、

バージョン管理やショートカット、インテリセンスなどを利用したいので、vscode上で開発する

Googleが提供しているgasのCLIツールを利用する事でローカルで開発できる

https://github.com/google/clasp

vscodeでの環境構築は下記参照

https://zenn.dev/cordelia/articles/3107aaf8b7a3d6

# 実装

今回のプロジェクト

https://github.com/RyuichiroYoshida/GAS_Tools

JavaScriptの言語仕様などは割愛

### Driveのアクティビティ取得

Googleが提供しているDriveActivityAPIという機能を利用する事で、Google Driveのアクティビティを取得する事が出来る

https://developers.google.com/apps-script/advanced/drive?authuser=0&hl=ja

https://developers.google.com/apps-script/advanced/drive-activity?hl=ja&authuser=0

DriveActivity.Activity.query(parameter)関数を利用する事で引数のパラメータに当てはまるActivityを取得できる

今回使っていないパラメータや、詳細を知りたい場合は公式のリファレンスを参照

```js
const request = {
  // アクティビティの取得範囲を指定 (直前10件サーチ)
  pageSize: 10,
  // アクティビティを取得するフォルダのIDを指定 (items/フォルダID)
  ancestorName: "items/" + rootFolderId,
  // アクティビティの取得範囲を指定 (since: 直前10分)
  filter: since ? `time > ${since}` : "",
  consolidationStrategy: { legacy: {} },
};
console.log(request);

try {
  // Activity.queryメソッドはGoogle Driveの過去のアクティビティをクエリします。
  const response = DriveActivity.Activity.query(request);
```

### Discordへのメッセージ送信

UrlFetchApp.fetch()関数を利用する事で、HTTPリクエストを送信できます

Discord Webhookについては調べるか

```js
/**
 * Google Drive 更新通知をDiscordに送信
 * @param {Discord送信メッセージ} message
 */
function postToDiscordWebhook(message, folderId) {
  const url = PropertiesService.getScriptProperties().getProperty(
    "DISCORD_WEBHOOK_URL"
  );
  // フォルダのURLと名前を取得
  let driveLink = DriveApp.getFolderById(folderId).getUrl();
  let driveName = DriveApp.getFolderById(folderId).getName();

  UrlFetchApp.fetch(url, {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify({
      content: "Google Drive 変更通知",
      embeds: [
        {
          title: driveName,
          url: driveLink,
          description: message,
          color: 5620992,
        },
      ],
    }),
  });
}
```

https://qiita.com/Eai/items/1165d08dce9f183eac74

https://qiita.com/murase/items/7a75f07d417366b2dbc8

# Google Driveの設定

ドライブの情報を読み取るためには **フォルダID** を利用する事で、ドライブ内のどのフォルダを読み込むかを設定できます

https://tetsuooo.net/gas/748/

# GAS管理画面での設定

### 利用するサービスの登録と認証

上記のAPIなどを利用するには、アプリケーション設定に追加する必要があります

画面左のサービスの＋ボタンから、Googleが提供しているAPIを利用する事が出来ます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551653/a10cd8d4-fcef-2917-f9b1-66602d57bdf3.png)

今回は **Drive** と **DriveActivity** をバージョンとIDはデフォルトそのままで利用します

これらを追加して関数を実行すると、初回実行時は権限の認証画面が出てくるので、Googleアカウントでログインして許可します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551653/4b46af31-9a9d-d248-f502-f6f2dd7e220e.png)

正常に実行されると、Discordへ結果が送信されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551653/84d0eef5-6c7e-2878-d28a-9b24a530193a.png)

### 環境変数の登録

gasにはスクリプトプロパティという機能があり、環境変数のようなものを定義できます

画面左のプロジェクトの設定タブから設定し、今回はこれらのプロパティを使用しています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551653/0f2e136d-96cd-0150-842d-623632b24579.png)

https://developers.google.com/apps-script/reference/properties?hl=ja

### トリガー登録

gasはトリガーを設定する事で、定期的に実行することが出来ます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551653/be733bbf-60c4-fe71-6e5e-0a8f85578307.png)

今回は10分おきに関数を実行するトリガーを設定しています

無料分で使える量には限りがあるので注意してください

https://qiita.com/kakakaori830/items/84a7dcba2d6119ed320a

https://developers.google.com/apps-script/guides/services/quotas?hl=ja#current_limitations

# 参考資料

https://zenn.dev/shikumiya_hata/books/33f44d4f561ec4/viewer/512304

https://zenn.dev/u1e2k/articles/2cbdeb9db4b3cc