我寫了一個小代碼,它應該抓取一個檔案夾中的所有檔案,并根據檔案名的前 10 個字符一個一個地放入一個檔案夾中。如果沒有具有該名稱的檔案夾,則創建一個。它的作業,但隨機停止并出現錯誤。(見下圖)
真正奇怪的是,如果我重新啟動它,它會繼續,并且在重新啟動幾次后它可以完成作業。為什么會隨機停止?你能幫我解決這個問題嗎?這讓我瘋狂。
先感謝您。
function sort() {
var inputFolder = DriveApp.getFolderById("thefolderid12343434343");
var files = inputFolder.getFiles();
let folders = inputFolder.getFolders();
let folderNames = [];
while (folders.hasNext()) {
var folder = folders.next();
folderNames.push(folder.getName());
}
while (files.hasNext()) {
var file = files.next();
var fileName = file.getName();
var destinationFolderName = fileName.substring(0,10); //for x characters
if (folderNames.includes(destinationFolderName)) {
var destinationFolderId =inputFolder.getFoldersByName(destinationFolderName).next().getId();
var processedFolder = DriveApp.getFolderById(destinationFolderId);
file.moveTo(processedFolder);
} else {
let newFolder = inputFolder.createFolder(destinationFolderName);
let destinationFolderId = newFolder.getId();
try{
var processedFolder = DriveApp.getFolderById(destinationFolderId);
file.moveTo(processedFolder);
}
catch(error){
Logger.log(destinationFolderName);
}
folderNames.push(destinationFolderName);
}
}
}


uj5u.com熱心網友回復:
不確定這是否是錯誤的原因,但我懷疑您可以稍微簡化代碼。
而不是這個:
var destinationFolderId =inputFolder.getFoldersByName(destinationFolderName).next().getId();
var processedFolder = DriveApp.getFolderById(destinationFolderId);
file.moveTo(processedFolder);
你可以使用這個:
var processedFolder = inputFolder.getFoldersByName(destinationFolderName).next();
file.moveTo(processedFolder);
如果你不打電話給DriveApp這里,也許會有所幫助。else和分支中的同樣的事情。
我沒有嘗試過代碼,我可能是錯的。
uj5u.com熱心網友回復:
我注意到這行代碼不必hasNext()檢查檔案夾是否存在。
if (folderNames.includes(destinationFolderName)) {
var destinationFolderId =inputFolder.getFoldersByName(destinationFolderName).next().getId();
var processedFolder = DriveApp.getFolderById(destinationFolderId);
file.moveTo(processedFolder);
}
通常,Exception: Cannot retrieve the next object: iterator has reached the end.當迭代器在檔案夾中找不到專案或檔案夾為空時發生。
相反,請嘗試使用 if 陳述句將其括起來hasNext():
if(inputFolder.getFoldersByName(destinationFolderName).hasNext()){
var destinationFolderId = inputFolder.getFoldersByName(destinationFolderName).next().getId();
var processedFolder = DriveApp.getFolderById(destinationFolderId);
file.moveTo();
}
注意:不迭代直接使用inputFolder.getFoldersByName(destinationFolderName).next().getId();只會得到與destinationFolderName名稱匹配的第一個檔案夾的id。
參考:
- 檔案夾迭代器
uj5u.com熱心網友回復:
不是最佳實踐,而是笨拙的拐杖......嘗試在try/catch這里使用:
try {
var destinationFolderId =inputFolder.getFoldersByName(destinationFolderName).next().getId();
var processedFolder = DriveApp.getFolderById(destinationFolderId);
file.moveTo(processedFolder);
} catch(e) {}
看看會發生什么。
如果服務器上出現一些故障并且它無緣無故地跳過了一些檔案/檔案夾,您可以嘗試解決方法。像這樣的東西:
var glitched_folders = [];
try {
var destinationFolderId =inputFolder.getFoldersByName(destinationFolderName).next().getId();
var processedFolder = DriveApp.getFolderById(destinationFolderId);
file.moveTo(processedFolder);
}
catch(e) {
glitched_folders.push(destinationFolderName);
}
然后對 . 重復該功能glitched_folders。
而且,鑒于日志中的時間戳,我懷疑您有數百個檔案。因此,最小化所有冗余操作是有意義的。
例如,如果您已經擁有檔案夾物件,則不需要獲取檔案夾的 ID。您可以將檔案夾物件存盤在陣列中并使用它們:
var files = inputFolder.getFiles();
let folders = inputFolder.getFolders();
let folderNames = [];
let folderObjects = []; // <-------------- here
while (folders.hasNext()) {
var folder = folders.next();
folderNames.push(folder.getName());
folderObjects.push(folder); // <-------------- here
}
然后(一次呼叫服務器):
var index = folderNames.indexOf(destinationFolderName);
if (index > -1) { file.moveTo(folderObjects[index]) }
而不是(對服務器的三個呼叫):
if (folderNames.includes(destinationFolderName)) {
var destinationFolderId =inputFolder.getFoldersByName(destinationFolderName).next().getId();
var processedFolder = DriveApp.getFolderById(destinationFolderId);
file.moveTo(processedFolder);
}
...等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/426842.html
