Почему эта переменная иногда не определена? - PullRequest
1 голос
/ 30 октября 2019

Таким образом, эта функция получает папку, получает подпапки, помещает некоторую информацию в массив и затем вставляет массив в мою электронную таблицу.

Сбой в странной точке примерно в 2-5% времени,и попытки, которые я предпринял, чтобы поймать ошибку раньше, просто не работают. почему / как!

function getFileCount(gdrive,level,fullpath){
  var folder = DriveApp.getFolderById(gdrive);
  var fileCount = 0;


  //append the subfolders to the sheet 
  var folders = folder.getFolders();
  var result = [];
  while (folders.hasNext()){
    var folder = folders.next();
    var path = fullpath + " > " +folder.getName();
    result.push([(level+1),folder.getId(), path,"?"]);
  }
  if (result == []) return fileCount;
  if (result == undefined) {console.log("Why the hell is it undefined?"+folder.getName()); return fileCount;}
  var sh = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sh.getSheetByName("FoldersPlusCounts");
  var end = ss.getLastRow()+1;  
  try{ss.getRange(end, 1,result.length, result[0].length).setValues(result);}catch(e){console.log(e+" "+gdrive+" ["+result+"]");return -1;}
  if (result.length > 0) SpreadsheetApp.flush();

  return fileCount;
}

оператор try catch находится там, где он терпит неудачу, говоря:

TypeError: Невозможно прочитать свойство 'length' из неопределенного 1dmDV2qdnU2Qqrg6mr-sxD8JaQncTUNqn []

Это происходит не каждый раз, когда в папке нет файлов или каждый раз, когда в ней нет папок, я не думаю.

Так как же иногда результат может быть неопределенным, когда ончетко определено как result = [], и если равно undefined, почему оно не фиксируется строкой "if result == undefined"?

Некоторые строки удалены для ясности (просто подсчет файлов) я все равно не использовал результат в этой части.

Ответы [ 2 ]

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

В вашем скрипте result объявлен как var result = [];. И result сравнивается с [].

. В Javascript в этом случае объект сравнивается как эталонный. Таким образом, result == [] всегда false. Чтобы подтвердить, является ли result [] пустым, как насчет следующей модификации?

С:

result == []

Кому:

result.length == 0

или

!result.length

Ссылки:

0 голосов
/ 31 октября 2019

Это сработало для меня:

function getFolderCount(){
  var fldr=DriveApp.getFolderById('folderId');
  var subfldrCount=0;
  var subfolders=fldr.getFolders();
  var result=[];
  while (subfolders.hasNext()){
    var subfolder=subfolders.next();
    result.push([++subfldrCount,subfolder.getName(),subfolder.getId()]);
  }
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("FoldersPlusCounts");
  sh.getRange(sh.getLastRow()+1, 1,result.length, result[0].length).setValues(result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...