首页 > 解决方案 > 循环浏览多个谷歌表格的多个标签

问题描述

我正在努力创建一个基于谷歌表格文档文件夹(目前有 6 个文件)的“主”谷歌表格。这些工作表中的每一个都有稍微不同数量的选项卡(有些名称略有不同),但我想循环一个公式来获取每个工作表文件中每个选项卡的值。(例如,fileA 有 3 个选项卡,我想从每个选项卡中获取数据并在具有 4 个选项卡的 fileB 中类似地重复)。我也想跳过一些命名的标签。

这是我的一段代码(2个隔行扫描函数):

function getDataFromSpreadsheet(ssID){

  var ss = SpreadsheetApp.openById(ssID)
  var allsheets = ss.getSheets();

    for(var s in allsheets){
    var sheet = allsheets[s];
    var data = []
      if(
       (sheet.getName() == "Summary") || 
       (sheet.getName() == "Data") || 
       (sheet.getName() == "Sheet1") ||
       (sheet.getName()== "Sheet2")
      ) continue;
      var lastrownum = sheet.getLastRow();
      var values = sheet.getRange("A2:L" + lastrownum).getValues();
      data = data.concat(values)
      Logger.log(data);
      return data;
     }
}

但是,这只是从每个文件中未命名为“摘要”、“数据”等的一个选项卡中获取/保存数据。

如何让它遍历所有工作表文件中的所有(非排除)选项卡???我无法编辑文件,因为这是为了创建一个自动化系统。

标签: google-apps-scriptgoogle-sheets

解决方案


解释:

for...in在 javascript 中迭代数组不是一个好习惯。如果您想了解更多信息,请参阅这篇文章

但是,您的代码中有两个问题:

  1. var data = [] 在循环内部,每次重新定义数组时都会清除以前的值。

  2. 您在循环中使用语句return,这意味着函数将在第一次迭代中终止,因为返回是每个函数执行的停止点。

解决方案(推荐):

我建议您使用forEach

function getDataFromSpreadsheet(ssID){

  const ss = SpreadsheetApp.openById(ssID)
  const allsheets = ss.getSheets();
  const sheetsToExclude = ["Summary","Data","Sheet1","Sheet2"];
  const data = [];
  allsheets.forEach(sheet=>{ 
    if(!sheetsToExclude.includes(sheet.getName())){
      var lastrownum = sheet.getLastRow();
      var values = sheet.getRange("A2:L" + lastrownum).getValues();
      data = data.concat(values) 
    }
});
   Logger.log(data);
   return data;
}

但是您的解决方案(在解决问题后)将像这样工作:

function getDataFromSpreadsheet(ssID){
  var ss = SpreadsheetApp.openById(ssID)
  var allsheets = ss.getSheets();
  var data = []
    for(var s in allsheets){
    var sheet = allsheets[s];        
      if(
       (sheet.getName() == "Summary") || 
       (sheet.getName() == "Data") || 
       (sheet.getName() == "Sheet1") ||
       (sheet.getName()== "Sheet2")
      ) continue;
      var lastrownum = sheet.getLastRow();
      var values = sheet.getRange("A2:L" + lastrownum).getValues();
      data = data.concat(values)          
     }
  Logger.log(data);
  return data;
}

推荐阅读