質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

1497閲覧

GドライブのファイルIDが更新(相違あったら)通知がくるようにしたい

tottey1226

総合スコア19

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2021/08/26 01:49

【やりたいこと】
① 特定の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); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

lastUpdateMap[file.getName()] = {lastUpdate : file.getLastUpdated(), fileId: file.getId()};

ここでファイル名をキーにしているため、同じ名前のファイルが存在した場合上書きされてしまうと思います。

同じファイル名のファイルを区別するのであれば、ファイルIDをキーとするようにして、

lastUpdateMap[file.getId()] = {lastUpdate : file.getLastUpdated(), fileId: file.getId()};

等とするべきではないでしょうか。
(なお、この変更を行うならば、あわせて他の所も直す必要が出てくるとは思います)


直す例としては下記のようになるかもしれません。
(なお、下記のコードだとスプレッドシート上の表示は、
ファイル名->更新日時->ファイルID から
ファイルID->更新日時->ファイル名 という順番に変わります)

diff

1function updateinvoiceCheck() { 2~略~ 3 allFilesId.forEach( 4 function( value, i ){ 5 let file =DriveApp.getFileById( value ); 6- lastUpdateMap[file.getName()] = {lastUpdate : file.getLastUpdated(), fileId: file.getId()}; 7+ lastUpdateMap[file.getId()] = {lastUpdate : file.getLastUpdated(), fileName: file.getName()}; 8 9 } 10 ); 11 12 // スプレッドシートに記載されているフォルダ名と更新日時を取得 13 let spreadsheet = SpreadsheetApp.openById(UPDATE_SHEET_ID); 14 let sheet = spreadsheet.getSheetByName(UPDATE_SHEET_NAME); 15 //Logger.log(sheet) 16 let data = sheet.getDataRange().getValues(); 17 //Logger.log('data: ' + data) 18 19 // 取得したデータをMapに変換する 20~略~ 21 // フォルダの情報とスプレッドシート情報を比較する 22 let updateFolderMap = []; 23~略~ 24 // ファイルが更新されているとき 25 sheet.getRange(sheetData[key].rowNo, 2).setValue(lastUpdateMap[key].lastUpdate); 26- sheet.getRange(sheetData[key].rowNo, 3).setValue(lastUpdateMap[key].fileId); 27+ sheet.getRange(sheetData[key].rowNo, 3).setValue(lastUpdateMap[key].fileName); 28- updateFolderMap.push({filename:key, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:lastUpdateMap[key].fileId}); 29+ updateFolderMap.push({filename:lastUpdateMap[key].fileName, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:key}); 30 } 31 } else { 32 // ファイルがシートに存在しないとき 33 let newRow = sheet.getLastRow() + 1; 34 sheet.getRange(newRow, 1).setValue(key); 35 sheet.getRange(newRow, 2).setValue(lastUpdateMap[key].lastUpdate); 36- sheet.getRange(newRow, 3).setValue(lastUpdateMap[key].fileId); 37+ sheet.getRange(newRow, 3).setValue(lastUpdateMap[key].fileName); 38- updateFolderMap.push({filename:key, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:lastUpdateMap[key].fileId}); 39+ updateFolderMap.push({filename:lastUpdateMap[key].fileName, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:key}); 40 } 41 } 42以下略

投稿2021/08/26 03:49

編集2021/08/26 04:41
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tottey1226

2021/08/26 10:59 編集

qnoir様 コードの詳細までご記載いただきありがとうございます! 最初のコメントを頂いた後自分なりに、書き換えてみました。qnoir様から頂いたコードとは、MAPの順番が少し異なって、ファイルID,更新日時、ファイル名としましたが、updateText += のセクションでつまづきました。 qnoir様からいただいたコードをもとに、書き換えたところ、エラーがなくなりました。 さきほど2ファイルテストで追加してみましたところ、2ファイルの更新通知が届きました。 GASビギナーなのため、まだまだ先輩方のように至らず、本当に感謝しかありません。ありがとうございます。明日、トリガーを実施し、希望する動作するようになりましたら是非コードとともにご報告させてください_(_^_)_
退会済みユーザー

退会済みユーザー

2021/08/26 12:11

わざわざご報告ありがとうございます。 詳細コード記載前にご自分で試されたとのことで、感心しました。 基本の勉強とともに、まずは自分で考えて手を動かすことが上達の早道と思います。
tottey1226

2021/08/27 09:30

qnoir様 ありがたいコメントをいただき恐縮です。はい、今後もできるだけ自分で解決できるよう精進いたします。 本日、トリガーを実行しましたところ、無事に動きました。 特定のフォルダ配下(サブフォルダも含む)に追加されたファイルのみ、スプレットシートに追記、Slackへ通知がされました。月末月初になればもっとファイルの追加がされるので、とても効率化につながると信じております。ありがとうございます! ちなみに、最初つまづいたところは、updateText += のセクション?のところで、 「Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。」とのことでした。こちらも引き続き原因を調べていく予定です。 ーーーー問題なく動いたコードを以下に転記いたしますーーーーーーーーーーーーーーーーーーーー // ★★★特定のフォルダ(サブフォルダも含む)の配下に新しくファイルが更新されたらSlackでファイルのURLを通知するスクリプト //対象のGoogleDriveフォルダのID let TARGET_FOLDER_ID = "フォルダID"; //更新日時を記録するのスプレッドシートのID let UPDATE_SHEET_ID = "スプレットシートのID"; //スプレッドシートのシート名 let UPDATE_SHEET_NAME = "folderlist"; function updateCheck20210827() { 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()}; lastUpdateMap[file.getId()] = {lastUpdate : file.getLastUpdated(), fileName: file.getName()}; } ); // スプレッドシートに記載されているフォルダ名と更新日時を取得 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].fileName); updateFolderMap.push({filename:lastUpdateMap[key].fileName, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:key}); } } 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].fileName); updateFolderMap.push({filename:lastUpdateMap[key].fileName, lastUpdate:lastUpdateMap[key].lastUpdate, fileId:key}); } } // 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" 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) { let payload ={ 'username':'フォルダへ請求書到着のお知らせ', 'color': '#0000FF', // 'text':text, 'text': "<!channel>" + targetFolder.getName() + "更新連絡通知" + "【" + targetFolder.getName() + "】が更新されました。\n\n"+ updateText, 'channel':'#work_gas_test' // 'text': 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); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問