Скрипты приложений Google: как правильно работать со значениями электронной таблицы, разделенными запятыми и преобразованными в массив - PullRequest
1 голос
/ 23 октября 2019

У меня есть электронная таблица, в которой столбец 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

1 Ответ

2 голосов
/ 23 октября 2019

Это была простая ошибка. Файлы назначения в ячейках моей электронной таблицы не были разделены запятой. Они были разделены запятой и пробелом. Я изменил var destFileIds = destFileIds.toString().split(",") на var destFileIds = destFileIds.toString().split(", "). Это вмещает пространство и устраняет мою проблему.

Надеюсь, это не позволит кому-то еще тратить столько времени, сколько я потратил на это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...