繁体   English   中英

使用 Google 应用脚本从多个工作表中获取数据

[英]Fetch data from multiple sheets using Google app script

试图从多个电子表格的. 所有工作表都存储在同一文件夹中。 必须按文件名仅从特定文件中获取一张主表中的数据。 我写了下面的脚本。 如果我们在指定范围内(在主工作表选项卡中)(getSheetByName) 仅输入一个文件名,它工作正常,但在尝试获取多个文件的数据时显示错误。 显示错误-“类型错误:无法读取未定义的属性‘长度’”下面是脚本-

function get_compiled_data() {    
  var filelist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FileName");  
  var filelists = filelist.getRange("A2:A").getValues();  
  var folder = DriveApp.getFolderById("1li9hBP_W5gPkb_ASKqin4j1ZGEn1Gvji");   
  var fileindex = folder.getFilesByName(filelists);  
  var file;
  var filetype;
  var sheetID;
  var collect_data = [];
  var data;    
  while (fileindex.hasNext()) {    
    file = fileindex.next();    
    filetype = file.getMimeType();    
    if (filetype === "application/vnd.google-apps.spreadsheet"){      
      sheetID = file.getId();      
      data = getData(sheetID);      
      data = data.map(function(r){return r.concat([file.getName()]);});      
      collect_data = collect_data.concat(data);      
    }      
  }  
  var target = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Compiled_Data");
  target.getRange("A2:AX").clearContent();
  target.getRange(2, 1, collect_data.length, collect_data[0].length).setValues(collect_data);  
}

function getData (sheetID) {  
  var sheet = SpreadsheetApp.openById(sheetID);
  var tab = sheet.getSheets()[0];
  var data = tab.getRange("A3:AX" + tab.getLastRow()).getValues();
  return data;  
}

问题:

当您应该提供一个字符串时,您正在向getFilesByName(name)提供一个二维数组。 因此,代码永远不会进入while块,并且collect_data仍然是一个空数组,导致collect_data[0] undefined ,并在尝试访问其length时产生观察到的错误。

当您寻找单个文件名时,您可能正在使用getValue() ,它会检索单个值,它可以是一个字符串,可以在getFilesByName中使用。 getValues()返回一个二维数组,因此您应该调整您的代码,以便它遍历getValues()返回的每个值。

解决方案:

编辑getValues()行并按以下方式将getFilesByName执行的所有操作包装在一个循环中:

function get_compiled_data() {
  var filelist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("FileName");      
  var filelists = filelist.getRange(2, 1, filelist.getLastRow() - 1).getValues(); 
  var folder = DriveApp.getFolderById("FOLDER-ID");
  filelists.forEach(fileName => {
    var fileindex = folder.getFilesByName(fileName[0]);
    // Rest of code
  });
});

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM