おれんじりりぃぶろぐ

きっと何者にもなれないエンジニアのブログ

gasを使って特定のGoogleドライブ以下のファイル更新を通知する

概要

特定のGoogleドライブ以下のファイル更新を検知してCWで通知する方法です。

なぜgasなのか(・・?)

何と言ってもスクリプトを実行するサーバーを用意しなくて済むからです。chatworkへの通知も非常にお手軽に実装することが可能です。 Googleドライブとの親和性ももちろん高く、簡単な実装で実現が可能です。

手順

ドライブの「新規作成」->「その他」->「Goggle Apps Script」を選択します。 スクリーンショット 2018-03-15 2.30.09.png (142.2 kB)

「リソース」->「ライブラリ」からChatworkClientを導入します。 スクリーンショット 2018-03-15 2.07.11.png (63.6 kB)

ライブラリを追加のところに「M6TcEyniCs1xb3sdXFF_FhI-MNonZQ_sT」を入力します。 * https://github.com/cw-shibuya/chatwork-client-gas

いい感じにスクリプトを書きます。

var Token = "xxxxxx";  // chatwork bot
var RoomId = xxxxx; // CWの部屋ID

//対象とするGoogleDrive親フォルダのID
// IDはURLのfolders/以下の英数字
var PARENT_FOLDER_ID = "xxxx";

// 24時間(ミリsec)
var SEARCH_TIME = 86400;

function myFunction() {
  var parentFolder = DriveApp.getFolderById(PARENT_FOLDER_ID);
  
  var dateobj = new Date();
  var nowUnixTime = Math.floor(dateobj.getTime() / 1000) ;
  var dayAgoUnixTime = nowUnixTime - SEARCH_TIME;
  var mes = "";
  
  mes += "[info][title](F)本日更新されたドキュメント一覧(F)[/title]";
  
  var allFiles = getAllFilesName(parentFolder);
  for(var i = 0; i < allFiles.length; i++){
    // ファイル更新のタイムスタンプ(unixtime)
    var fileTimeStamp = Math.floor(Date.parse(allFiles[i].getLastUpdated())/1000);
    
    if(fileTimeStamp > dayAgoUnixTime){
      mes += "* ";
      mes += allFiles[i].getName();
      mes += "\n";
      
      mes += "  * ";
      mes += allFiles[i].getUrl();
      mes += "\n";
      
    }
    
    //Logger.log(allFiles[i].getName());
  }

  mes += "[/info]";
  
  // CW通知
  var client = ChatWorkClient.factory({token: Token});
  client.sendMessage({room_id: RoomId, body: mes});
  
}

function getAllFilesName(parentFolder){
  var fileList = [];
  var files = parentFolder.getFiles();
  while(files.hasNext()){
    fileList.push(files.next());
  }
  
  var childFolders = parentFolder.getFolders();
  
  while(childFolders.hasNext()){
    var childFolder = childFolders.next();
    
    // 再帰的な呼び出し
    fileList = fileList.concat(getAllFilesName(childFolder));
  }
  return fileList;
}

getFiles()getFolders()では、そのフォルダに属したファイルやフォルダしか取れないため再帰的に取得を行う必要があります。

トリガーを好きな時間に設定します。 「編集」->「現在のプロジェクトのトリガー」->「新しいトリガーを追加」から設定します。

スクリーンショット 2018-03-15 2.17.24.png (55.7 kB)

通知が来ます スクリーンショット 2018-03-18 0.30.01.png (36.6 kB)

リファレンス