Список файлов возвращается неопределенным, когда нет файлов - PullRequest
1 голос
/ 06 февраля 2020

Я использую этот код для возврата списка файлов в папке на диске Google. Он работает очень хорошо, пока в нем нет папки без файлов. Он возвращает ошибку, которая говорит: «Невозможно прочитать свойство 'length' из undefined".

Я предполагаю, что где-то должен быть оператор if, else, чтобы возвратить "null" или приемлемый выход для l oop кроме "undefined", который может быть выведен в тот же диапазон, что указан в выходных данных.

function kuehnertdates() {
  var folderId = 'FolderID';
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();
  var output = []; 
  while (files.hasNext()) {
    var file = files.next();
    output.push([file.getName(), file.getLastUpdated()]);
  }
  output.sort(function(a, b) {
    return a[0] == b[0] ? 0 : a[0] < b[0] ? -1 : 1;
  });
  SpreadsheetApp.getActive().getSheetByName('Farms').getRange(2, 17, output.length, output[0].length).setValues(output);

}

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Ответ:

Files: list не возвращается неопределенным, когда нет файлов - когда в папке нет файлов, ваша переменная output продолжает иметь пустое значение массива ( []) и поэтому вызов output[0] возвращает неопределенное значение при вызове output[0].length.

Исправление:

Вам просто нужно внести небольшое изменение, чтобы запустить только код если файлы действительно существуют в папке, в которой вы запускаете метод Files: list из:

function kuehnertdates() {
  var folderId = '1BYAxJVN5NIMWVsUE2RATl4vPhWBl5Jyc';
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();

  // this is the if condition you need to add
  if (!files.hasNext()){
    return;
  }
  else {
    // continue your code here
    var output = [];
    while (files.hasNext()) {
      var file = files.next();
      output.push([file.getName(), file.getLastUpdated()]);
    }
    output.sort(function(a, b) {
      Logger.log(a[0] == b[0] ? 0 : a[0] < b[0] ? -1 : 1);
      return a[0] == b[0] ? 0 : a[0] < b[0] ? -1 : 1;
    });
    SpreadsheetApp.getActive().getSheetByName('Farms').getRange(2, 17, output.length, output[0].length).setValues(output);
  }
}

Я надеюсь, что это полезно для вас!

Ссылки:

0 голосов
/ 06 февраля 2020

Попробуйте это:

function runOne() {
  var folderId = 'folderId';
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFiles();
  if(files.hasNext()) {
    var output = []; 
    while (files.hasNext()) {
      var file = files.next();
      output.push([file.getName(), file.getLastUpdated()]);
    }
    output.sort(function(a, b) {
      return a[0] == b[0] ? 0 : a[0] < b[0] ? -1 : 1;
    });
    SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange(1, 1, output.length, output[0].length).setValues(output);
  }else{
    Browser.msgBox('You have no files')
  }
}
...