当前位置: 首页 > 知识库问答 >
问题:

循环浏览多个google工作表的多个选项卡

长孙阳焱
2023-03-14

我正在创建一个“主”谷歌工作表的基础上的谷歌工作表文件文件夹(目前6个文件)。每个工作表的选项卡数量略有不同(有些名称略有不同),但我想循环一个公式以获取每个工作表文件中每个选项卡的值。(例如,fileA有3个选项卡,我想从每个选项卡中获取数据,并在fileB中重复类似的操作,fileB有4个选项卡)。我还想跳过几个命名选项卡。

下面是我的一段代码(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;
     }
}

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

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

共有1个答案

都乐逸
2023-03-14

在javascript中使用for... in迭代数组不是一个好的做法。如果你想了解更多,请参考这篇文章。

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

>

  • 你有var数据 = []在循环中,每次你重新定义数组,因此以前的值被清除。

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

    我建议你使用for每个:

    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;
    }
    

  •  类似资料:
    • 我有30张单独的工作表,需要合并成一张有多个选项卡的工作表。我可以使用下面的脚本来完成这项工作,但每次都会创建一个新的工作表。当30张单独的工作表中的一张或全部更新时,我只希望这个脚本更新或重写以前创建的“主工作表”。 我正在寻找一个表,其中包含从每个地区的标签。这将允许我与单独更新的所有信息共享一个主控表。

    • 我不是100%确定是正确的公式,但我尝试的是: 我想修改上面的公式来做以下事情。我有一个多标签谷歌表。只有一个选项卡将所有数据存储为元数据,以填充其他6个选项卡。我将元数据拆分为6个选项卡,但希望避免重复选项卡中的数据。因此,我想创建一个列,显示数据当前的位置(如果已经放置)。以下是一个例子: 主表有以下数据: 将有4个标签,我有相同的列(姓名,电话,地址,电子邮件)。我将把主控表中的数据拆分为这

    • 我正在尝试使用Netty4.1编写一个TCP服务器,它将承载数千个持久连接(TL)。x、 在性能测试期间,我们观察到,如果有几千个到服务器的连接,然后我们得到一个突发的连接,比如说另外几千个连接,这些新的SSL握手会使工作线程长时间处于繁忙状态,这会导致现有连接开始超时。在internet上提供的所有Netty示例中,我看到服务器是这样引导的: 我想知道我是否可以使用两个工人组而不是一个。因此,我

    • 我们正在使用最新版本的spring。 我们正在使用Spring mvc的@Session属性来支持会话范围中的数据... 问题是当我们使用浏览器的多个选项卡时,它不能像预期的那样工作。. 我们有一个搜索页面,允许使用使用多个字段搜索数据库。.我们在会话中使用@Session属性存储结果。 问题:例如,用户给出一些输入和搜索,结果存储在名为“搜索结果”的会话中。 如果用户打开新选项卡并再次使用不同的

    • 选择Radiobutton时,如果其中两个选项具有相同的元素/值,则两个选项都被选中。 我这样做了,所以我附加到我的列表中的元素是不同的(如CourseInfo(“English1”)、CourseInfo(“English2”)...)我的程序按照我想要的方式工作。只有当元素相同时,它才不起作用。我试图追加到如上所示的列表中,但这并没有解决我的错误。

    • 为此,我在谷歌上搜索了很多,但不知道怎么做。 我有3家公司为我们提供股票,让我们假设谷歌表单中的公司1、公司2和公司3。 一旦我们添加订单,它将反映在各个公司的谷歌表单订单中。并非所有公司都必须看到所有订单,因为它们可能处理特定项目。 现在每一家公司google sheet都有可用的股票下拉列表,带有(是/否)选项,可以检查特定的订单id是否可行。 我的要求是:如果任何一家公司的股票更新为“是”,