【问题标题】:Pull a row of data from multiple tabs in Google Sheets and display in one Master Sheet从 Google 表格的多个选项卡中提取一行数据并显示在一个主表格中
【发布时间】:2021-02-09 12:09:00
【问题描述】:

我希望在 Google 表格文档中创建一个主表格,该表格从每个选项卡中提取一行数据 (C33:AC33)(但不包括以下选项卡:菜单、模板、类列表)。我需要使用脚本,因为标签会不断变化并被添加到其中。

我需要从主表的第 5 行第 2 列显示新数据。在第一列中,我想显示数据来自的选项卡的名称。

这可能吗?我一直在寻找几个小时,这是我发现的最接近的 sn-p 代码,我认为它可以满足我的需要,但是我是一个脚本新手,不知道我是否走在正确的轨道上:

function pullRows() {
  const ss = SpreadsheetApp.getActive();
  const arr = ss
    .getSheets()
    .filter(s => !s.getName().includes('Master', 'Template', 'Class List';))
    .flatMap(s => s.getDataRange(C33:AC33).getValues());
flatten it
  ss.getSheetByName('Master')
    .getRange(5, 2, arr.length, arr[0].length)
    .setValues(arr);
}

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:

    我相信你的目标如下。

    • 您想要从工作表中检索单元格“C33:AC33”的值,'Master', 'Template', 'Class List' 除外。
    • 您希望将值放入“主”表。在这种情况下,您希望通过将工作表名称添加到顶列来为每一行放置每个工作表中的每个值。
    • 您想从单元格“B5”中输入这些值。

    修改点:

    • 关于!s.getName().includes('Master', 'Template', 'Class List';),当你想用这个时,请修改为!['Master', 'Template', 'Class List'].includes(s.getSheetName()
    • 关于s.getDataRange(C33:AC33).getValues()getDataRange 没有参数。而C33:AC33 不是字符串值。
    • 在这种情况下,我想提出以下流程。
      1. 从除“主”、“模板”、“类列表”之外的每个工作表中检索值。
      2. 将最终值放入主表。

    当以上几点反映到你的脚本中时,它变成如下。

    修改脚本:

    function pullRows() {
      // 1. Retrieve the values from each sheet except for 'Master', 'Template', 'Class List'.
      const ss = SpreadsheetApp.getActive();
      const arr = ss
        .getSheets()
        .filter(s => !['Master', 'Template', 'Class List'].includes(s.getSheetName()))
        .map(s => [s.getSheetName(), ...s.getRange("C33:AC33").getValues()[0]]);
    
      // 2. Put the final values to Master sheet.
      ss.getSheetByName('Master')
        .getRange(5, 2, arr.length, arr[0].length)
        .setValues(arr);
    }
    

    注意:

    • 当您想通过将工作表名称添加到顶行来为每列放置每个工作表中的每个值时,您还可以使用以下脚本。我无法理解你想要达到的目标。所以作为附加脚本,我添加了以下脚本。

        function pullRows() {
          // 1. Retrieve the values from each sheet except for 'Master', 'Template', 'Class List'.
          const ss = SpreadsheetApp.getActive();
          const arr = ss
            .getSheets()
            .filter(s => !['Master', 'Template', 'Class List'].includes(s.getSheetName()))
            .map(s => [s.getSheetName(), ...s.getRange("C33:AC33").getValues()[0]]);
      
          // 2. Transpose the retrieved values.
          const res = arr[0].map((_, i) => arr.map(r => r[i]));
      
          // 3. Put the final values to Master sheet.
          ss.getSheetByName('Master')
            .getRange(5, 2, res.length, res[0].length)
            .setValues(res);
        }
      

    参考资料:

    【讨论】:

    • 谢谢田池!这是完美的,正是我想要做的 - 除了结果不是垂直显示在列中,有没有办法可以在行中显示它?示例:工作表 1 - B5、工作表 2 - B6 等。
    • @BLibrary 如果您尝试第一个代码 sn-p,您会注意到数据按您的意愿显示在行中。我不确定您是否希望工作表名称显示在 A 列中,在这种情况下,您应该在指定目标范围 (.getRange(5, 1, res.length, res[0].length)) 时进行一些小的修改。
    • 谢谢 lamblichus - 我想要 A 列中的名称,所以进行了调整,但由于某种原因我的结果仍显示在列中?
    • @B 图书馆感谢您的回复。我带来的不便表示歉意。在我的回答中,第二个示例脚本将值垂直放置。但是,第一个示例脚本是为了实现您的回复。这些值是水平放置的。你能确认吗?如果这也不是您期望的方向,我可以问您期望的详细输出吗?
    • @B Library 感谢您再次回复并测试它。我很高兴你的问题得到了解决。关于第一个脚本,当您想更改开始列时,请修改为.getRange(5, 1, res.length, res[0].length)作为Iamblichus的第一个评论。
    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多