У меня есть электронная таблица, в которой столбец 1 содержит идентификаторы исходного файла;каждая ячейка содержит только один идентификатор. В столбце 2 указаны идентификаторы файлов назначения, в которых одна ячейка содержит несколько идентификаторов, разделенных запятой. У меня есть скрипт, который получает эти значения и делает другие вещи. Вот фрагмент кода, который включает в себя все манипуляции с указанными переменными:
// Retrieve the source and destination IDs from spreadsheet
var toFileIds = myFile.getRange(2,2,key.getLastRow()-1, 1).getValues(); // Get the destination file IDs from myFile
var sourceFileIds = myFile.getRange(2,1,key.getLastRow()-1, 1).getValues(); // Get the source file IDs from myFile
// Write-out the global vars
var stringtoFileIds = JSON.stringify(toFileIds); // Convert to string as required by PropertiesService
var stringsourceFileIds = JSON.stringify(sourceFileIds); // Convert to string as required by PropertiesService
PropertiesService.getScriptProperties().setProperty('toFileIds', stringtoFileIds);
PropertiesService.getScriptProperties().setProperty('sourceFileIds', stringsourceFileIds);
У меня есть второй скрипт, который просматривает исходный файл и находит соответствующие целевые файлы, указанные выше:
// Read-in global vars
toFileIds = PropertiesService.getScriptProperties().getProperty('toFileIds');
sourceFileIds = PropertiesService.getScriptProperties().getProperty('sourceFileIds');
toFileIds = JSON.parse(toFileIds);
sourceFileIds = JSON.parse(sourceFileIds);
// Retrieve the destination file IDs
var ArrPos = sourceFileIds.indexOf('activeFile'); // Find the position of the active file name within the stored arr
var destFileIds = destFileIds[ArrPos]; // Use that position to find the destination files
var destFileIds = destFileIds.toString().split(","); // Do this so that each comma separated ID is its own element in arr
// Mark if there are no destination files
if (destFileIds == undefined) {
var destFileIds = "no";
}
// Cache the var
cache = CacheService.getPublicCache();
cache.put("destFileIds", JSON.stringify(destFileIds), 400);
Наконец, у меня есть третий скрипт, который включает в себя фрагмент проверки ошибок. Именно здесь возникает проблема:
if (destFileIds != "no") {
for (var i = 0; i <= destFileIds.length -1; i++) {
try {
DriveApp.getFileById(destFileIds[i]);
} catch (e) {
//Logger.log(e.message);
throw 'At least one of the destination files does not exist.';
}
}
}
В этом последнем фрагменте кода можно ожидать появления сообщения об ошибке, только если идентификатор в массиве не завершится. Когда все элементы destFileIds
существуют, этот фрагмент работает для первого элемента, но затем выдает определенную выше ошибку для второго элемента массива и затем завершает работу. Я на 100% уверен, что все идентификаторы файлов верны. Я вручную проверил это, разместив их в URL. Я также вручную определил массив с этими идентификаторами, и код работал нормально, то есть он работает как ожидалось:
var destFileIds = ["myID1", "myID2", "myID3"]; // Where these are replaced with real IDs
if (destFileIds != "no") {
for (var i = 0; i <= destFileIds.length -1; i++) {
try {
DriveApp.getFileById(destFileIds[i]);
} catch (e) {
//Logger.log(e.message);
throw 'No updates were made because all of the related (copy to) templates do not appear to exist.';
}
}
}
Любые идеи о том, почему второй элемент может не читаться так же, как первый элемент destFileIds
* * 1015