Для цикла выдает ошибку getFileById (): «Не удалось найти элемент с данным идентификатором .....» - PullRequest
1 голос
/ 11 октября 2019

Прежде всего, я очень новичок в программировании и просто выясняю все по ходу дела. Я пытаюсь написать скрипт приложения, который будет копировать определенные файлы по идентификатору (идентификаторы хранятся в файле листа Google) в эту новую папку, которая создается при отправке формы. Но мой for бросает цикл и выдает ошибку: «Не удалось найти элемент с данным идентификатором, или у вас нет разрешения на доступ к нему» (строка 30, файл «Сценарий приложения»)

Даже если язапустить код с каждым файлом (byID) по отдельности, он работает. Может кто-нибудь сказать мне, что я делаю неправильно (идентификаторы в коде ниже не являются действительными идентификаторами)

function SheetAutomation(){
    function getSheetById(id) {
      return SpreadsheetApp.getActive().getSheets().filter(
      function(s) {return s.getSheetId() === id;}
      )[0];
    }

  var sheet_form_res = getSheetById(1692343941);
  var lr = sheet_form_res.getLastRow();
  var casenumber = sheet_form_res.getRange(lr,1).getValue();
  Logger.log(casenumber);

  var folder = DriveApp.getFolderById("1tr2A3e3edwelB8dgkN8tgdPYv8T8V6");
  var newFolder = folder.createFolder(casenumber);
  var newFolderID = newFolder.getId();
  Logger.log('newFolderID: ' + newFolderID);
  var casefolderid = sheet_form_res.getRange(lr, 7).setValue(newFolderID);
  Logger.log('Casefolder id: ' + casefolderid.getValues());

  var sheet_dsd_image_id = getSheetById(1233563458640);
  var num_dsd_images = sheet_dsd_image_id.getRange(lr,1).getValue();
  Logger.log('num_dsd_images: ' + num_dsd_images);

  for (var i=0; i<=num_dsd_images; i++){
    var image_id = sheet_dsd_image_id.getRange(lr,i+1).getValue();
    Logger.log(image_id);
    // The line of code that doesn't work
    var image_file = DriveApp.getFileById(image_id);
    Logger.log(image_file);
  }
};

Я заменил цикл forсо следующим, чтобы увидеть, если у меня действительно не было доступа к файлам, но это, кажется, работает, я просто не могу заставить его работать через цикл

  var image_id_1 = sheet_dsd_image_id.getRange(lr,2).getValue();
  var image_file_1 = DriveApp.getFileById(image_id_1);
  Logger.log(image_file_1);
  image_file_1.makeCopy(newFolder);

  var image_id_2 = sheet_dsd_image_id.getRange(lr,3).getValue();
  var image_file_2 = DriveApp.getFileById(image_id_2);
  Logger.log(image_file_2);
  image_file_2.makeCopy(newFolder);

  var image_id_3 = sheet_dsd_image_id.getRange(lr,4).getValue();
  var image_file_3 = DriveApp.getFileById(image_id_3);
  Logger.log(image_file_3);
  image_file_3.makeCopy(newFolder);

Триггеры проекта следующие: Скриншот окна триггера проекта

1 Ответ

3 голосов
/ 11 октября 2019

Мне кажется вероятным, что это ошибка одной ошибки. Вы уверены, что ваш цикл for находится в пределах ожидаемого диапазона? Вы определяете свой диапазон с помощью <=:

for (var i=0; i<=num_dsd_images; i++)

Это означает, что если num_dsd_images равно 3, используются следующие значения i: 1, 2, 3, 4. Это правильно? Исходя из названия вашей переменной, я бы ожидал, что только 3 изображения не 4.

Если вы используете <, а не <=, значения для i будут: 1, 2, 3. С этимизмените, ваш цикл будет выглядеть так:

for (var i=0; i < num_dsd_images; i++){
    var image_id = sheet_dsd_image_id.getRange(lr,i+1).getValue();
    Logger.log(image_id);
    // The line of code that doesn't work
    var image_file = DriveApp.getFileById(image_id);
    Logger.log(image_file);
 }

В качестве альтернативы, вы можете 1-индексировать свой диапазон и использовать <= следующим образом: for (var i = 1; i <= num_dsd_images; i++)

...