【问题标题】:Google Script Drive File Sizes to Spreadsheet - File Iterator Not WorkingGoogle Script Drive File Sizes to Spreadsheet - 文件迭代器不工作
【发布时间】:2018-03-14 10:25:56
【问题描述】:

我正在尝试将我在 Google Drive 中的所有文件的列表放入 Google 电子表格中。我正在使用以下代码:

function driveFileSizes() {
  var userProperties = PropertiesService.getUserProperties();
  var continuationToken = userProperties.getProperty('LOG_ALL_FOLDERS_CONTINUATION_TOKEN');
  var start = new Date();
  var end = new Date();
  var maxTime = 1000*60*4.5; // Max safe time, 4.5 mins
  var file;
  var value=[];
  var values=[];
  var sheet = SpreadsheetApp.getActive().getActiveSheet();
  var lastRow = sheet.getLastRow() +1;

  if (continuationToken == null) {
    var files = DriveApp.getFiles();
  } else {
    var files = DriveApp.continueFileIterator(continuationToken); 
  }

  while (files.hasNext() && end.getTime() - start.getTime() <= maxTime) {
    file = files.next();
    value[1] = file.getSize();
    if(value[1]>0){
      value[0]=file.getName();
      values.push(value);
    }
    end = new Date();
  }

  sheet.getRange(lastRow, 1, values.length, 2).setValues(values);

  if(files.hasNext()){
    var continuationToken = files.getContinuationToken();
    userProperties.setProperty('LOG_ALL_FOLDERS_CONTINUATION_TOKEN', continuationToken); 
  } else {
    // Delete the token
    PropertiesService.getUserProperties().deleteProperty('LOG_ALL_FOLDERS_CONTINUATION_TOKEN');
  }
}

代码运行并将数据存储到电子表格中,但它只是一遍又一遍(数千次)的同一个文件。

我做错了什么?感觉就像每个循环都会覆盖整个 values 数组。

这肯定是我在做傻事,但我再也见不到树木了。

【问题讨论】:

    标签: javascript arrays google-apps-script google-drive-api google-spreadsheet-api


    【解决方案1】:

    问题出在你的循环中:

    while (files.hasNext() && end.getTime() - start.getTime() <= maxTime) {
      file = files.next();
      value[1] = file.getSize();
      if (value[1] > 0) {
        value[0] = file.getName();
        values.push(value);
      }
      end = new Date();
    }
    

    您将相同的对象value 存储在循环中,并分配给它的属性(而不是它)。因为您的输出中充满了同一个对象,所以所有引用都会一起更新。

    您可以通过每次推送一个新对象来避免这种情况:

    var fs = file.getSize();
    if (fs > 0) {
      values.push([file.getName(), fs]);
    }
    

    如果需要,您可以在循环外声明 fs 变量并仍然正确使用它,因为整个对象被分配给它,而不是它的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多