【やりたいこと】
① 特定のGドライブのフォルダ配下に(サブフォルダ含む)ファイルが追加(又は更新)
されたら、スプレットシートに、ファイル名、更新日時、ファイルIDをリスト追記
② Slackに通知
【わからないこと】
追加された「ファイル名」が既にスプレットシートのリストにあったら通知が来ない
ファイル名関係なく、ファイルが追加されたら通知くるようにしたかったのだけれども。
【現状】
以下のスクリプトを実行すると
・追加された「ファイル名」がスプレットシートのリストになければSlackに通知は来る
(同様に、スプレットシートにも同じファイル名は記載されません)
ファイルIDをみるように書いているつもりでしたので、他にも色々試しましたが原因がわかりませんでした…
つたない文章で申し訳ございません。
どなたかおわかりになる方、ご教示いただけないでしょうか><
//対象のGoogleDriveフォルダのID let TARGET_FOLDER_ID = "フォルダID"; //更新日時を記録するのスプレッドシートのID let UPDATE_SHEET_ID = "スプレットシートのID"; //スプレッドシートのシート名 let UPDATE_SHEET_NAME = "folderlist"; function updateinvoiceCheck() { let targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID); let folders = targetFolder.getFolders(); let files = targetFolder.getFiles(); //フォルダ内を再帰的に探索してすべてのファイルIDを配列にして返す function getAllFilesId(targetFolder){ let filesIdList = []; let files = targetFolder.getFiles(); while(files.hasNext()){ filesIdList.push(files.next().getId()); } let child_folders = targetFolder.getFolders(); while(child_folders.hasNext()){ let 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)); let allFilesId = getAllFilesId(targetFolder); let lastUpdateMap = {}; //Logger.log(folders) allFilesId.forEach( function( value, i ){ let file =DriveApp.getFileById( value ); lastUpdateMap[file.getName()] = {lastUpdate : file.getLastUpdated(), fileId: file.getId()}; } ); // スプレッドシートに記載されているフォルダ名と更新日時を取得 let spreadsheet = SpreadsheetApp.openById(UPDATE_SHEET_ID); let sheet = spreadsheet.getSheetByName(UPDATE_SHEET_NAME); //Logger.log(sheet) let data = sheet.getDataRange().getValues(); //Logger.log('data: ' + data) // 取得したデータをMapに変換する let sheetData = {}; for (let i = 0; i < data.length; i++) { sheetData[data[i][0]] = {name : data[i][0], lastUpdate : data[i][1], rowNo : i + 1}; } // フォルダの情報とスプレッドシート情報を比較する let 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 { // ファイルがシートに存在しないとき let 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) // 新規及び更新された情報を作成 let 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" } //Slackへ通知する if (updateFolderMap.length != 0) { // let text='これはテスト送信です'; let payload ={ 'username':'請求書に関してのお知らせ', 'color': '#0000FF', // 'text':text, 'text': "<!channel>" + targetFolder.getName() + "更新連絡通知" + "【" + targetFolder.getName() + "】が更新されました。\n\n"+ updateText, 'channel':'#work_gas_test' }; let options={ 'method':'post', 'contentType':'application/json', 'payload':JSON.stringify(payload) }; let url='ここに★webhookのURLを書いてます'; UrlFetchApp.fetch(url,options); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/26 10:59 編集
退会済みユーザー
2021/08/26 12:11
2021/08/27 09:30