takaremonnの備忘録

takaremonnの備忘録

趣味

Googleドライブの更新をLINEで通知したい

投稿日:

こんばんわ、takaremonnです。

最近はコロナウイルスによって休みが多くなってきていて、ここに何か書こうかなとしばしば思うのだけれど、なかなか書こうという気になれない。ただ、サーバーを移したり、ドメイン更新をしたり、他にも小さな変更を色々としたのでそのあたりは(備忘録らしく)いつかまとめてしておきたい。

きっかけ

さて、このコロナウイルスの影響で学校で資料などの配布にGoogleDriveの共有フォルダを使うようになった。

願望ではグループに特化したSlackやTeamsなどで配信、オンライン授業もできるようにしてほしいが、教員の中にはPCを(あまり)使えない人もいる(そういう人に教えるような仕組みはある気がするが、まぁ今回の話とは異なるのであまり書かないでおこう)のでしょうがないかもしれない。

共有フォルダのリンクをQRコードにして配布された、というところまでは良かったのだが、「読み込んだURLをSafariのブックマークに登録しておいて更新したら気づくように時々アクセスしてね」と言われた。

(自分のようにAndroidユーザーもいるのになぜSafariかは置いといて)確認しに行くのは面倒!

というわけで、最近少しは使えるようになったGoogleAppScript(GAS)とIFTTTを使って「GoogleDriveのファイルが更新されたらLINEに通知が来るBot」を作るに至った。

幸いなことに少し調べると、ドライブの更新をGmailで送信するというものを作っている人がいたのでそちらのソースを拝借して少し書き換えただけで使えるようになった。(作るのにかかった時間はだいたい1.5時間くらい?初心者なのでよくわからないところが多かった)

参考にしたページ

作成したソース

今回は各学年ごとにフォルダが分けられていたので”updateCheck_1~3″といったようにそれぞれ分けて取得するようにした。


//更新日時を記録するのスプレッドシートのID ブラウザでアクセスしてURL見れば分かる
var UPDATE_SHEET_ID = "xxxxxxxxxxxxxxxxxxxxxxxxxx";

function update_All() {
  updateCheck_3();
  updateCheck_2();
  updateCheck_1();
}

function updateCheck_3() {
  //対象とするGoogleDriveフォルダのID ブラウザでアクセスしてURL見れば分かる
  var TARGET_FOLDER_ID = "xxxxxxxxxxxxxxxxxxxxxxx";
  //スプレッドシートのシート名(下に表示されるタブのやつ)
  var UPDATE_SHEET_NAME = "GDrive_3";
  var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
  var folders = targetFolder.getFolders();
  var files = targetFolder.getFiles();

  //フォルダ内を再帰的に探索してすべてのファイルIDを配列にして返す
  function getAllFilesId(targetFolder){
    var filesIdList = [];
    
    var files = targetFolder.getFiles();
    while(files.hasNext()){
      filesIdList.push(files.next().getId());
    }
    
    var child_folders = targetFolder.getFolders();
    while(child_folders.hasNext()){
      var child_folder = child_folders.next();
      //Logger.log( 'child_folder :' + child_folder );

      //Logger.log('getAllFilesId(child_folder):'+ getAllFilesId(child_folder));
      filesIdList = filesIdList.concat( getAllFilesId(child_folder) );
    }
    return filesIdList;
  }
  //Logger.log('getAllFilesId(targetFolder):' + getAllFilesId(targetFolder));
  var allFilesId = getAllFilesId(targetFolder);
  var lastUpdateMap = {};
  //Logger.log(folders)
  allFilesId.forEach(
    function( value, i ){
      var file =DriveApp.getFileById( value );
      lastUpdateMap[file.getName()] = {lastUpdate : file.getLastUpdated(), fileId: file.getId()};
    }
  );          
 
  // スプレッドシートに記載されているフォルダ名と更新日時を取得。
  var spreadsheet = SpreadsheetApp.openById(UPDATE_SHEET_ID);
  var sheet = spreadsheet.getSheetByName(UPDATE_SHEET_NAME);
  //Logger.log(sheet)
  var data = sheet.getDataRange().getValues();
  //Logger.log('data: ' + data)
  // 取得したデータをMapに変換。
  var sheetData = {};
  for (var i = 0; i < data.length; i++) {
    sheetData[data[i][0]] = {name : data[i][0], lastUpdate : data[i][1], rowNo : i + 1};
  }

  // 実際のフォルダとスプレッドシート情報を比較。
  var updateFolderMap = [];
  for (key in lastUpdateMap) {
    if( UPDATE_SHEET_ID == lastUpdateMap[key].fileId ){
      continue;
    }
    if(key in sheetData) {
      // フォルダ名がシートに存在する場合。
      if(lastUpdateMap[key].lastUpdate > sheetData[key].lastUpdate) {
        // フォルダが更新されている場合。
        sheet.getRange(sheetData[key].rowNo, 2).setValue(lastUpdateMap[key].lastUpdate);
        sheet.getRange(sheetData[key].rowNo, 3).setValue(lastUpdateMap[key].fileId);
        updateFolderMap.push({filename:key, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:lastUpdateMap[key].fileId});
      }
    } else {
      // フォルダ名がシートに存在しない場合。
      var newRow = sheet.getLastRow() + 1;
      sheet.getRange(newRow, 1).setValue(key);
      sheet.getRange(newRow, 2).setValue(lastUpdateMap[key].lastUpdate);
      sheet.getRange(newRow, 3).setValue(lastUpdateMap[key].fileId);
      updateFolderMap.push({filename:key, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:lastUpdateMap[key].fileId});
    }
  }
  //Logger.log('updateFolderMap:' + updateFolderMap)
  // 新規及び更新された情報をメール送信。
  var updateText = "";
  for( key in updateFolderMap ){
    item = updateFolderMap[key];
    updateText += 
     item.filename + ' 更新日時:' + Utilities.formatDate(item.lastUpdate, "JST", "yyyy-MM-dd HH:mm:ss") + '\n' 
    + DriveApp.getFileById(item.fileId).getUrl() + "\n\n"
  }
  
  if (updateFolderMap.length != 0) {
    sendIFTTTWebHook(targetFolder.getName() + "更新連絡通知\n\n"+"【" + targetFolder.getName() + "】が更新されました。\n\n"+
      updateText);
  
  }
}

function updateCheck_2() {
  //対象とするGoogleDriveフォルダのID ブラウザでアクセスしてURL見れば分かる
  var TARGET_FOLDER_ID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  //スプレッドシートのシート名(下に表示されるタブのやつ)
  var UPDATE_SHEET_NAME = "GDrive_2";
  var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
  var folders = targetFolder.getFolders();
  var files = targetFolder.getFiles();

  //フォルダ内を再帰的に探索してすべてのファイルIDを配列にして返す
  function getAllFilesId(targetFolder){
    var filesIdList = [];
    
    var files = targetFolder.getFiles();
    while(files.hasNext()){
      filesIdList.push(files.next().getId());
    }
    
    var child_folders = targetFolder.getFolders();
    while(child_folders.hasNext()){
      var child_folder = child_folders.next();
      //Logger.log( 'child_folder :' + child_folder );

      //Logger.log('getAllFilesId(child_folder):'+ getAllFilesId(child_folder));
      filesIdList = filesIdList.concat( getAllFilesId(child_folder) );
    }
    return filesIdList;
  }
  //Logger.log('getAllFilesId(targetFolder):' + getAllFilesId(targetFolder));
  var allFilesId = getAllFilesId(targetFolder);
  var lastUpdateMap = {};
  //Logger.log(folders)
  allFilesId.forEach(
    function( value, i ){
      var file =DriveApp.getFileById( value );
      lastUpdateMap[file.getName()] = {lastUpdate : file.getLastUpdated(), fileId: file.getId()};
    }
  );          
 
  // スプレッドシートに記載されているフォルダ名と更新日時を取得。
  var spreadsheet = SpreadsheetApp.openById(UPDATE_SHEET_ID);
  var sheet = spreadsheet.getSheetByName(UPDATE_SHEET_NAME);
  //Logger.log(sheet)
  var data = sheet.getDataRange().getValues();
  //Logger.log('data: ' + data)
  // 取得したデータをMapに変換。
  var sheetData = {};
  for (var i = 0; i < data.length; i++) {
    sheetData[data[i][0]] = {name : data[i][0], lastUpdate : data[i][1], rowNo : i + 1};
  }

  // 実際のフォルダとスプレッドシート情報を比較。
  var updateFolderMap = [];
  for (key in lastUpdateMap) {
    if( UPDATE_SHEET_ID == lastUpdateMap[key].fileId ){
      continue;
    }
    if(key in sheetData) {
      // フォルダ名がシートに存在する場合。
      if(lastUpdateMap[key].lastUpdate > sheetData[key].lastUpdate) {
        // フォルダが更新されている場合。
        sheet.getRange(sheetData[key].rowNo, 2).setValue(lastUpdateMap[key].lastUpdate);
        sheet.getRange(sheetData[key].rowNo, 3).setValue(lastUpdateMap[key].fileId);
        updateFolderMap.push({filename:key, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:lastUpdateMap[key].fileId});
      }
    } else {
      // フォルダ名がシートに存在しない場合。
      var newRow = sheet.getLastRow() + 1;
      sheet.getRange(newRow, 1).setValue(key);
      sheet.getRange(newRow, 2).setValue(lastUpdateMap[key].lastUpdate);
      sheet.getRange(newRow, 3).setValue(lastUpdateMap[key].fileId);
      updateFolderMap.push({filename:key, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:lastUpdateMap[key].fileId});
    }
  }
  //Logger.log('updateFolderMap:' + updateFolderMap)
  // 新規及び更新された情報をメール送信。
  var updateText = "";
  for( key in updateFolderMap ){
    item = updateFolderMap[key];
    updateText += 
     item.filename + ' 更新日時:' + Utilities.formatDate(item.lastUpdate, "JST", "yyyy-MM-dd HH:mm:ss") + '\n' 
    + DriveApp.getFileById(item.fileId).getUrl() + "\n\n"
  }
  
  if (updateFolderMap.length != 0) {
    sendIFTTTWebHook(targetFolder.getName() + "更新連絡通知\n\n"+"【" + targetFolder.getName() + "】が更新されました。\n\n"+
      updateText);
  
  }
}

function updateCheck_1() {
  //対象とするGoogleDriveフォルダのID ブラウザでアクセスしてURL見れば分かる
  var TARGET_FOLDER_ID = "xxxxxxxxxxxxxxxxxxxxxxx";
  //スプレッドシートのシート名(下に表示されるタブのやつ)
  var UPDATE_SHEET_NAME = "GDrive_1";
  var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
  var folders = targetFolder.getFolders();
  var files = targetFolder.getFiles();

  //フォルダ内を再帰的に探索してすべてのファイルIDを配列にして返す
  function getAllFilesId(targetFolder){
    var filesIdList = [];
    
    var files = targetFolder.getFiles();
    while(files.hasNext()){
      filesIdList.push(files.next().getId());
    }
    
    var child_folders = targetFolder.getFolders();
    while(child_folders.hasNext()){
      var child_folder = child_folders.next();
      //Logger.log( 'child_folder :' + child_folder );

      //Logger.log('getAllFilesId(child_folder):'+ getAllFilesId(child_folder));
      filesIdList = filesIdList.concat( getAllFilesId(child_folder) );
    }
    return filesIdList;
  }
  //Logger.log('getAllFilesId(targetFolder):' + getAllFilesId(targetFolder));
  var allFilesId = getAllFilesId(targetFolder);
  var lastUpdateMap = {};
  //Logger.log(folders)
  allFilesId.forEach(
    function( value, i ){
      var file =DriveApp.getFileById( value );
      lastUpdateMap[file.getName()] = {lastUpdate : file.getLastUpdated(), fileId: file.getId()};
    }
  );          
 
  // スプレッドシートに記載されているフォルダ名と更新日時を取得。
  var spreadsheet = SpreadsheetApp.openById(UPDATE_SHEET_ID);
  var sheet = spreadsheet.getSheetByName(UPDATE_SHEET_NAME);
  //Logger.log(sheet)
  var data = sheet.getDataRange().getValues();
  //Logger.log('data: ' + data)
  // 取得したデータをMapに変換。
  var sheetData = {};
  for (var i = 0; i < data.length; i++) {
    sheetData[data[i][0]] = {name : data[i][0], lastUpdate : data[i][1], rowNo : i + 1};
  }

  // 実際のフォルダとスプレッドシート情報を比較。
  var updateFolderMap = [];
  for (key in lastUpdateMap) {
    if( UPDATE_SHEET_ID == lastUpdateMap[key].fileId ){
      continue;
    }
    if(key in sheetData) {
      // フォルダ名がシートに存在する場合。
      if(lastUpdateMap[key].lastUpdate > sheetData[key].lastUpdate) {
        // フォルダが更新されている場合。
        sheet.getRange(sheetData[key].rowNo, 2).setValue(lastUpdateMap[key].lastUpdate);
        sheet.getRange(sheetData[key].rowNo, 3).setValue(lastUpdateMap[key].fileId);
        updateFolderMap.push({filename:key, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:lastUpdateMap[key].fileId});
      }
    } else {
      // フォルダ名がシートに存在しない場合。
      var newRow = sheet.getLastRow() + 1;
      sheet.getRange(newRow, 1).setValue(key);
      sheet.getRange(newRow, 2).setValue(lastUpdateMap[key].lastUpdate);
      sheet.getRange(newRow, 3).setValue(lastUpdateMap[key].fileId);
      updateFolderMap.push({filename:key, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:lastUpdateMap[key].fileId});
    }
  }
  //Logger.log('updateFolderMap:' + updateFolderMap)
  // 新規及び更新された情報をメール送信。
  var updateText = "";
  for( key in updateFolderMap ){
    item = updateFolderMap[key];
    updateText += 
     item.filename + ' 更新日時:' + Utilities.formatDate(item.lastUpdate, "JST", "yyyy-MM-dd HH:mm:ss") + '\n' 
    + DriveApp.getFileById(item.fileId).getUrl() + "\n\n"
  }
  
  if (updateFolderMap.length != 0) {
    sendIFTTTWebHook(targetFolder.getName() + "更新連絡通知\n\n"+"【" + targetFolder.getName() + "】が更新されました。\n\n"+
      updateText);
  
  }
}

// IFTTTにWebHookをPOSTする
function sendIFTTTWebHook(value) {
  var message = {
    "value1":value
  };

  var options = {
    "method":"POST",
    "headers": {
      "Content-Type":"application/json"
    },
    "payload":JSON.stringify(message)
  };
  
  UrlFetchApp.fetch("IFTTTのWebhookURL", options) //IFTTTのWebhookURLを入力
}

 

使い方としては、

  • 専用のスプレッドシートを作成し、”GDrive_1″、2、3、、といった名前のシートを作成
  • スプレッドシートのid(URLの一部)を記入
  • 更新を監視したいフォルダのid(URLの一部)をそれぞれ記入
  • IFTTTのトリガーを作成(参考リンクを参照)してWebhookURLを取得、記入

といったところだ。コードについてはほとんどコピペをしたのでグチャグチャだったりインデントがおかしいところがある。

これで”update_All”を実行すればそれぞれの取得が始まって自動的に通知が飛ぶはずだ。今の所、トリガーは5分おきに設定しているが、もしかすると実行回数が多すぎるかもしれない。その場合は少し減らしたりなどして対処する。

-趣味
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

no image

Xiaomi Mi Band 4 を発表

こんばんは takaremonnです ちょうど学校のテストが終わり、一休み(2週間後にはまたテスト)   そんな中、いつものようにRSSリーダー(Inoreader)を巡回していると、個人的 …

no image

Braveクリエイターに登録した

こんにちは takaremonnです。 最近はコロナウイルスの影響で自宅に引きこもる生活が続いていて少し物足りない気がする。 目次1 「Brave」とは2 「Braveクリエイター」登録手順3 広告を …

no image

SONY製ヘッドホン WH-CH510を購入

こんにちは。takaremonnです。 最近、世間では新型コロナウイルスが騒がれていて、電車に乗る機会が多い自分も気にし始めた。 さて、手頃でそれなりの性能のあるヘッドホン無いかな~ と探していたとこ …

no image

Google Classroomの投稿をLINEに転送するボットを作ってみた

こんにちは takaremonnです。 ようやく最近、WordPress投稿画面でシフトキーとエンター同時押し(同時ではないけど)で段落を変えずに改行ができる(Wordで言う↩と↓みたいな)ことに気づ …