【问题标题】:How can I merge multiple tabs in a Google Spreadsheet using Google App Script?如何使用 Google App Script 合并 Google 电子表格中的多个选项卡?
【发布时间】:2016-10-10 04:18:27
【问题描述】:

如何使用 Google App Script 合并 Google 电子表格中的多个选项卡?所有选项卡中的数据都在不断变化。

例如,我在 Google 电子表格中有“Sheet1”、“Sheet2”和“Sheet3”。所有这些表中的数据都有 3 列 - 名称和电子邮件 ID 和地区。现在,我想将这 3 个工作表/选项卡中存在的数据合并/组合到第 4 个工作表中,即具有相同列(名称、电子邮件 ID 和区域)的“工作表 4”。第 4 张表的数据应为 - Sheet1 的数据,然后是 Sheet2,然后是 Sheet3。所有 3 张纸中的行数不断变化。

【问题讨论】:

  • 例如我在 Google 电子表格中有“Sheet1”、“Sheet2”和“Sheet3”。所有这些表中的数据都有 3 列 - 名称和电子邮件 ID 和地区。现在,我想将这 3 个工作表/选项卡中存在的数据合并/组合到第 4 个工作表中,即具有相同列(名称、电子邮件 ID 和区域)的“工作表 4”。第 4 张表的数据应为 - Sheet1 的数据,然后是 Sheet2,然后是 Sheet3。 3张纸的行数一直在变化。

标签: google-apps-script google-sheets


【解决方案1】:

您不需要为此编写脚本。在第四张纸中,在 A2 中输入以下公式:

={filter(Sheet1!A2:C, len(Sheet1!A2:A)); filter(Sheet2!A2:C, len(Sheet2!A2:A)); filter(Sheet3!A2:C, len(Sheet3!A2:A))}

它返回 A-C 列的内容,其中 A 列中的条目为非空,并将它们堆叠在一个数组中。

【讨论】:

    【解决方案2】:

    =query({Sheet1!A1:C; Sheet2!A1:C; Sheet3!A1:C}, "where Col1 is not null", 0)

    我不会为此使用脚本;至少在大多数情况下,工作表公式要快得多。 确保使用分号分隔范围。分号是数组字面量的 End_Of_Row 运算符。

    如果你真的想使用脚本...

    function combineSheets() {
      var sApp = SpreadsheetApp.getActiveSpreadsheet();
      var s1= sApp.getSheetByName("Sheet1");
      var s2= sApp.getSheetByName("Sheet2");
      var s3= sApp.getSheetByName("Sheet3");
      var s4= sApp.getSheetByName("Sheet4");
      //  If Sheet4 doesn't exist you'll need to create it here.
      
      var s1values = s1.getRange(1,1,s1.getLastRow(),3).getValues();
      var s2values = s2.getRange(1,1,s2.getLastRow(),3).getValues();
      var s3values = s3.getRange(1,1,s3.getLastRow(),3).getValues();
      
      //  Now, we can put out all together and stuff it in Sheet4
      var s4values = [];
      s4values =  s1values.concat(s2values,s3values);
      s4.getRange(1,1,s4values.length,3).setValues(s4values);
    }
    

    【讨论】:

    • 我修复了代码,因此它实际上可以与我创建的通用电子表格一起运行,三张表只填充了随机数,一张空白表。您需要根据自己的用例对其进行修改。
    • @soyp 的想法是正确的,只需检查每一行的第一列。我使用一个过滤器扫描组合数组中的空白 A1 值,soup 使用 len() 函数查找每张表中的行数,然后将它们组合起来。哪种方式更好或更快很可能取决于您的上下文。
    • 我认为公式应该是:=filter({{Sheet1!A1:C500};{Sheet2!A1:C500};{Sheet3!A1:C500}};{{Sheet1!A1: A500};{Sheet2!A1:A500};{Sheet3!A1:A500}}"") 它有一个 , 而不是 ;在那里。
    • @AndréGil 逗号是过滤函数参数的分隔符。它不在任何一个数组结构中。
    【解决方案3】:

    我制作了一个可以合并九个选项卡的选项卡,其中包含更多行和列。

    =filter({{Sheet1!A1:Q500};{Sheet2!A1:Q500};{Sheet3!A1:Q500};{Sheet4!A1:Q500};{Sheet5!A1:Q500};{Sheet6!A1:Q500};{Sheet7!A1:Q500};{Sheet8!A1:Q500};{Sheet9!A1:Q500}},{{Sheet1!A1:A500};{Sheet2!A1:A500};{Sheet3!A1:A500};{Sheet4!A1:A500};{Sheet5!A1:A500};{Sheet6!A1:A500};{Sheet7!A1:A500};{Sheet8!A1:A500};{Sheet9!A1:A500}}<>"")
    

    我想知道这是否是一种概括初始过滤器公式的方法,以便您可以剪切和粘贴更多工作表编号,例如,如果有 20 个或 30 个选项卡和 25 列,您可以轻松地将其合并到一页?

    【讨论】:

      【解决方案4】:

      您可以为此使用 Google Apps 脚本。

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      function TotalsSheet() {
        var totaldata = [];
        var sheets = ss.getSheets();
        var totalSheets = 2;
      
        for (var i=0; i < totalSheets; i++) {
          var sheet = sheets[i];
          var range = sheet.getDataRange();
          var values = range.getValues();
      
          for (var row in values) {
            totaldata.push(values[row]);
          }
        }
        return totaldata; 
      }
      
      function Start() {
        var All = ss.insertSheet("All-Values");
        var totaldata = TotalsSheet();
        for (var i = 0; i < totaldata.length; i++) {
          All.appendRow(totaldata[i]);
        } 
      }
      

      【讨论】:

      • 谢谢@tehhowch,我已经做了你的改变。
      • 请注意,每次插入新工作表可能不是所需的行为,尤其是具有相同名称的情况下(Spreadsheet#getSheetByName(name) 只会返回具有给定名称的最左侧工作表...)。您可能应该只插入一张不存在的工作表
      【解决方案5】:

      //这个脚本必须更快

      function consolidateData(){
      
        // defined all variables
        var sheetNames = [];
        var dataSheet = [];
        var dataValues = [];
        var conso=[];
        var header = [["Name","email ID","Region"]];
        var ws = SpreadsheetApp.getActiveSpreadsheet();
      
        // get all sheets
        var allsheets = ws.getSheets();
      
        for(var s in allsheets){
          var sheet = allsheets[s];    
          sheetNames[s] = sheet.getName();
          dataSheet[s] = ws.getSheetByName(sheetNames[s]);
      
          // adding all sheet's data to a single variable
          conso = conso.concat(dataSheet[s].getRange("A2:C"+dataSheet[s].getLastRow()).getValues());  
        }
      
        // writing data into new sheet
        var newSheet = ws.insertSheet().setName("Consolidated_Data");
            newSheet.getRange("A1:C1").setValues(header);
            newSheet.getRange("A2:C"+(conso.length+1)).setValues(conso);  
      
      
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 2022-10-18
        • 2021-09-05
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 1970-01-01
        • 2014-01-12
        相关资源
        最近更新 更多