代码之家  ›  专栏  ›  技术社区  ›  kxm

Google Script将文件大小转换为电子表格-文件迭代器不工作

  •  0
  • kxm  · 技术社区  · 6 年前

    我正在尝试将我在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');
      }
    }
    

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

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   tehhowch    6 年前

    问题在您的循环中:

    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 变量,并且仍然正确使用它,因为整个对象是指定给它的,而不是它的属性。