.getValues ​​() в Google Script возвращает объект, не являющийся массивом - в результате получается «TypeError: Невозможно прочитать свойство« 0 »из неопределенного». - PullRequest
0 голосов
/ 16 января 2020

Симптом, указывающий на наличие проблемы, - это ошибка: TypeError: Cannot read property "0" from undefined., и ошибка присоединяется к строке, являющейся оператором if внутри для l oop. Мне кажется, что проблема в первых нескольких строках кода, так что это то, что я поставлю здесь. Я поставлю полный сценарий в конце.

  var ss = SpreadsheetApp.getActive();
  var controlRoomSheet = ss.getSheetByName("Master Doc");
  var urls = controlRoomSheet.getRange(1,2,50,3).getValues();
  for(var i = 3; i < urls.length + 3; i ++){
    if(urls[i][0].slice(0, 3) == "1st" && urls[i-3][1] == null || urls[i-3][1] == "MISSING FACILITY NAME"){
      urls[i-3][1] = "MISSING FACILITY NAME";

Чтобы найти проблему, я использовал команду google logger.log, чтобы просмотреть содержимое. urls не отображается как массив, просто все значения, которые должны быть в этом массиве, разделены запятой, вот и все.

Я написал отдельный скрипт, который выполняет всего три вещи, открывает документ, получает страницу по имени и получает содержимое сначала одной ячейки, а затем всего диапазона. Проверил результаты в Logger.log, отлично работает. Затем я переместил тот же код обратно в мой скрипт, и bam, он ломается.

Я воссоздал настройку здесь .

Если вам нужна остальная часть код, вот полный сценарий.

function createDocAndFirstTab(){
  var ss = SpreadsheetApp.getActive();
  var controlRoomSheet = ss.getSheetByName("Master Doc");
  var urls = controlRoomSheet.getRange(1,2,50,3).getValues();
  for(var i = 3; i < urls.length + 3; i ++){
    if(urls[i][0].slice(0, 3) == "1st" && urls[i-3][1] == null || urls[i-3][1] == "MISSING FACILITY NAME"){
      urls[i-3][1] = "MISSING FACILITY NAME";
    }
    else if(urls[i][0].slice(0, 3) == "1st" && urls[i][0].slice(0, 5) == "https" && urls[i][2] != "Yes"){
      var newDoc = urls[i-3][1];
      var newSS = SpreadsheetApp.create('newDoc');
      newSS.rename(urls[i-3][1]);
      var newDocUrl = urls[i][1];
      var sourceSS = SpreadsheetApp.openByUrl(newDocUrl);
      var allSourceTabs = sourceSS.getSheets();
      var sourceTab = allSourceTabs[0];
      sourceTab.copyTo(newSS);
      var newSSTabs = newSS.getSheets();
      var rawRoster1 = newSSTabs[1];
      rawRoster1.setName("Roster");
      urls[i-2][1] = newSS.getUrl();
      urls[i][2] = "Yes";
      //. before closing out the creation of this file, place it in the correct folder (and make sure that folder exists!)
      DriveApp.searchFolders(controlRoomSheet.getRange('C1').getValues());
    }
  }
  controlRoomSheet.getRange(1,2,controlRoomSheet.getLastRow(),3).setValues(urls);
}

1 Ответ

0 голосов
/ 24 января 2020

Вопрос

Почему я получаю сообщение об ошибке «Невозможно прочитать свойство» 0 «из неопределенного» * ​​1004 *

Ответ

В строке 5 вы используете

i < urls.length + 3; он требует неопределенного индекса, поэтому вместо него вы можете использовать

i < urls.length;

Окончательный код

function createDocAndFirstTab(){

  var ss = SpreadsheetApp.getActive();
  var controlRoomSheet = ss.getSheetByName("Master Doc");
  var urls = controlRoomSheet.getRange(1,2,50,3).getValues();

  for(var i = 3; i < urls.length; i++){

    if(urls[i][0].slice(0, 3) == "1st" && urls[i-3][1] == null || urls[i-3][1] == "MISSING FACILITY NAME"){

      urls[i-3][1] = "MISSING FACILITY NAME";

    }else if(urls[i][0].slice(0, 3) == "1st" && urls[i][0].slice(0, 5) == "https" && urls[i][2] != "Yes"){

      var newDoc = urls[i-3][1];
      var newSS = SpreadsheetApp.create('newDoc');
      newSS.rename(urls[i-3][1]);

      var newDocUrl = urls[i][1];
      var sourceSS = SpreadsheetApp.openByUrl(newDocUrl);
      var allSourceTabs = sourceSS.getSheets();
      var sourceTab = allSourceTabs[0];
      sourceTab.copyTo(newSS);

      var newSSTabs = newSS.getSheets();
      var rawRoster1 = newSSTabs[1];
      rawRoster1.setName("Roster");

      urls[i-2][1] = newSS.getUrl();
      urls[i][2] = "Yes";

      //. before closing out the creation of this file, place it in the correct folder (and make sure that folder exists!)
      DriveApp.searchFolders(controlRoomSheet.getRange('C1').getValues());

    }
  }

 controlRoomSheet.getRange(1,2,urls.length,3).setValues(urls);

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