【问题标题】:Google Apps Script for copying an array from multiple sheets onto a single Status Summary sheet用于将数组从多个工作表复制到单个状态摘要工作表的 Google Apps 脚本
【发布时间】:2019-03-21 22:55:25
【问题描述】:

我一直在尝试找到一个可以复制的脚本(对我的特定工作表进行了一些修改),但没有什么能完全满足我的需要,而且我没有编写代码的技能从头开始。

我有一个包含多个工作表的 Google 电子表格,我们将不断添加新工作表,我们推出的每个新产品都会添加一个工作表。每个工作表(包括从模板创建的新工作表)都有该产品发布准备状态的“概览”摘要。这始终位于每张纸上的 M3:M10。

我有一张状态摘要表,我想在其中粘贴每张表中 M3:M10 处的信息。这将使我们能够在状态摘要中快速查看每个产品在发布前的表现,而无需我们检查每个特定工作表的标签。

这是我最希望发生的事情:

  • 脚本将遍历工作簿中包含的每个工作表,但会跳过名为“状态摘要”的工作表。
  • 脚本将从每个工作表的 M3:M10 中提取数据
  • 脚本会将 M3:M10 数据存放在“状态摘要”中,以组织 A2:H2 中的信息(我的列标签是 A1:H1)。例如:Sheet 1 上的 M3 数据将存放在 Status Summary 的 A2 中,Sheet 1 上的 M3 数据将存放在 Status Summary 的 B2 中,等等。
  • 脚本将自动为每个新工作表使用一个新行。例如:Sheet 1 上的 M3 数据将在 Status Summary 的 A2 中,Sheet 2 上的 M3 数据将在 Status Summary 的 A3 中,等等。

我不需要包含的工作表的名称。

有人能帮我写这个吗?我正在尝试自学如何编写这些脚本,因此对每个部分所做的一些“//”解释将是一个巨大的帮助。感谢您的关注!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    试试这个:

    function atAGlance() {
      var ss=SpreadsheetApp.getActive();
      var excl=['Status Summary'];
      var sh=ss.getSheetByName('Status Summary');
      var shts=ss.getSheets();
      var n=1;
      for(var i=0;i<shts.length;i++) {
        if(excl.indexOf(shts[i].getName())==-1){
          var v1=shts[i].getRange("M3:M10").getValues();
          var v2=transpose(v1);
          sh.getRange(1 + n++,1,v2.length,v2[0].length).setValues(v2);
        }
      }
    }
    //https://stackoverflow.com/a/16705104/7215091
    function transpose(a)
    {
      return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
    }
    

    从 [https://stackoverflow.com/a/16705104/7215091] 得到转置 (https://stackoverflow.com/a/16705104/7215091)

    此版本允许您从流程中排除工作表,您可以在 testAtAGlance() 函数中运行它,如下所示。我使用的示例排除了“状态摘要”和“全局”。

    function testAtAGlance() {
      atAGlance(['Status Summary','Globals']);
    }
    
    function atAGlance(excl) {
      var excl=excl || ['Status Summary'];
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getSheetByName('Status Summary');
      var shts=ss.getSheets();
      var n=1;
      for(var i=0;i<shts.length;i++) {
        if(excl.indexOf(shts[i].getName())==-1){
          var v1=shts[i].getRange("M3:M10").getValues();
          var v2=transpose(v1);
          sh.getRange(1 + n++,1,v2.length,v2[0].length).setValues(v2);
        }
      }
    }
    //https://stackoverflow.com/a/16705104/7215091
    function transpose(a)
    {
      return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
    }
    

    【讨论】:

    • 谢谢!不过,我遇到了错误,我不确定它们是什么意思。 sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn()).clearContent(); //该行出现“范围的坐标或尺寸无效”的错误。你能告诉我这条线在做什么,所以我可以尝试修复它吗? var v=sht[i].getRange("M3:M10").getValues(); //此行似乎需要从 v=sht 中删除“t”。我将其更改为“v = sh [i]”,这似乎有帮助。我对么?感谢您的帮助!
    • 它正在运行,一旦我将第 7 行“var v=sht[i].getRange”更改为“var v=shts[i].getRange”。但它只从 M3 中提取信息,而不是从 M3:M10 中提取信息。我运行了两次,它只是再次在 M3 中添加了信息。我错过了什么?
    • 很抱歉。
    • 我不太确定接下来要如何处理脚本,以便它返回我正在寻找的结果(M3:M10 的整个范围)。我是否试图用脚本做一些不可能的事情?我尝试用于此目的的其他脚本的范围有问题。它只想从单个单元格中读取数据,而不是多个单元格。
    • 好的,我认为最后的更改应该做到这一点。我终于测试了它并弄清楚它有什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多