GASでGoogleドライブ監視システムを作成

[ZOZOテクノロジーズ #4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech4)の記事です。
昨日は @mikankitten さんの「[NginxにgRPCとHTTP/1.1の共存の設定をする](https://qiita.com/mikankitten/items/f1b8660c73f9cecabfb0)」でした。

本記事では、業務効率化の一環で作成したツールについて書いていきます。

# はじめに
自分が関わっているプロジェクトでは、ファイルのやりとり等をGoogleドライブ経由で行なっています。
特にアパレル関係の資料のやりとりは量、頻度が多く、ファイルの更新やアップロードをうまく共有しきれていない場面が発生していました。

そんな中、以下のようなドライブ監視ツールがあればという要望を受け、今回のツールを作成しました。

- 更新されたファイルがあればSlackに通知がきてほしい
- 監視対象のフォルダを使う側で編集出来る様にしてほしい


# スプレッドシートの内容

今回は以下の様に２行目から下に向かって記載していきます。
フォルダIDは200行目まで読み込むようにしていますが、Webhook URLは2行目のみの読み込みとなります。

<img width="926" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/5c450d87-e5db-80f0-c802-9e1f5802ffa7.png">

GoogleドライブのフォルダIDの取得方法につきましては以下のページの中盤辺りで説明されています。

[【GAS/非エンジニア向け】GoogleDriveの特定のファイルデータをSpread Sheet書き出すプログラムまとめ](https://note.com/virtual_surfer/n/n770e9445759f)

Webhook URLは以下のページを参考に取得してみてください。

[Slack でのIncoming Webhook の利用](https://slack.com/intl/ja-jp/help/articles/115005265063)


# GASソースコード
ソースコード自体は上記のスプレッドシートの中に記載しています。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/916d9295-2fcc-318d-6ebf-c7b896ae9969.png)

「ツール」の「スクリプトエディタ」を選択します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/c10387a6-eb4a-fcb7-c185-979d15e8f619.png)

表示されたエディター上に以下のソースコードを入力。


```JS
function myFunction() {
  
  // フォルダIDの取得
  var folderIdList = getFolderId()
  
  var text = ""
  
  for(var i = 0; i < folderIdList.length; i++)
  {
    var latestUpdate = getLatestUpdate(folderIdList[i])
    
    for(var j = 0; j < latestUpdate.length; j++)
    {
      if(i == 0 && j == 0)
      {
        // 改行しない
      }
      else
      {
        text += "\n\n"
      }
      
      text += latestUpdate[j] + "\n"
    }
  }
  
  // 何もなければ終了
  if(text == "")
  {
    return
  }
  
  var payload = {
    "text" : "<!here>" + "\n" + "Googleドライブの更新がありました。\n以下ご確認お願いします。\n```" + text + "```", // メッセージの本文
    "channel" : "slackのチャンネル名",
    "icon_url" : "アイコン画像のURL",
    "username" : "アカウントの名前",
  }
    
  postSlack(payload);
  
  
}

// フォルダIDの取得処理
function getFolderId()
{
  var sheet=SpreadsheetApp.getActiveSheet()
  var values=sheet.getRange("A2:A200").getValues()
  var list = []
  
  for(var i = 0; i < values.length; i++){
    
    if(values[i] == ""){
      break;
    }
    list.push(values[i])
  }
  
  return list
}

// webhook URLの取得
function getWebhook()
{
  var sheet=SpreadsheetApp.getActiveSheet()
  var url=sheet.getRange("B2").getValues()
  
  return url
}



// 最新の更新を取得
function getLatestUpdate(folderId)
{
  // フォルダ情報を取得
  var folder = DriveApp.getFolderById(folderId);
  // ファイル一覧を取得
  var files = folder.getFiles()
  var list = []
  var count = 0
  
  var fileNames = '';
  while (files.hasNext()) {
    var file = files.next();
    var last = file.getLastUpdated()
    
    var d = new Date()
    // 30分以内に更新されたファイルを検索
    if(last.getTime() >= (d.getTime() - 1800000))
    {
      list.push("【FileName】 : " + file.getName() + "【FilePath】 : " + file.getUrl())
    }
    count++
  }
  
  return list
}

function postSlack(payload)
{
  var options = {
    "method" : "POST",
    "payload" : JSON.stringify(payload)
  }

  // webhook URLの取得
  var url = getWebhook();
  var response = UrlFetchApp.fetch(url, options);
  var content = response.getContentText("UTF-8");

}

```

# トリガーの設定方法

プログラムが起動するタイミングを設定します。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/eb6eb1e6-6e91-5964-a3f6-ecfca2199fc0.png)

スクリプトエディタの「編集」から「現在のプロジェクトのトリガー」を選択します。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/d9bcac0e-3c40-0c88-fbdb-394688f16ec2.png)

「トリガーを追加」を選択。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/db7f247c-5d6c-5145-57e1-d6bf264c6715.png)

今回は上記の様に設定し保存します。
これでプログラムが時間ごとに動き出します。

# 実行結果

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308887/bdf98e51-68f1-c86e-a05c-5b209bcdac57.png)

こんな感じで通知が送られてきます。
実行間隔やフォルダの読み込み数等はお好みでカスタムしていただければと思います。

# おわりに
今回初めてGASを使ってみたのですが、身近な業務効率化ツールをさらっと作るにはおすすめです。
マクロに慣れている方にはJSは使いづらいかもしれませんが、ネット上で記事が多くあるので機会があれば使ってみてください！

[ZOZOテクノロジーズ #4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zozo_tech4) 明日は @tkani さんによる「[spring-graal-nativeでSpring BootをGraalVM native imageにしてみる](https://qiita.com/tkani/items/37878d268db54d581a1b)」です。