【问题标题】:Grouping Rows and moving in a single Google Sheet using Google Apps Script使用 Google Apps 脚本对行进行分组并在单个 Google 表格中移动
【发布时间】:2021-08-08 16:04:02
【问题描述】:

我收到包含一些随机行的电子表格,每次我需要将行组织在某些组中,并在 2 个组之间添加一个空白行。 我可以通过在一列中定义的标签或标识符号列来识别组,但我还需要获取可识别组正下方的行。

我已经将一些工作代码混合在一起以更改我需要的一些名称,并添加了一个将触发这些功能的菜单,但我什至无法理解如何将这些行分组和移动到我需要的顺序出现了。

有没有人知道我该如何构建它,或者有什么建议?

示例文件:

test file

目的:

在文件中,我模拟了获取工作表的方式,我需要将第二个标识符行及其各自的总数(如下所示)排列在一起。

我添加了我一直在修改的代码,我也会在这里添加:

function onOpen() {
       var ss = SpreadsheetApp.getActive();
       var items = [
          {name: 'Changenames', functionName: 'Changegroupnames'},
          null, // Results in a line separator.
          {name: 'Organize Rows', functionName: 'movingROWS'}
       ];
    
       ss.addMenu('Organize', items);
    }
    
    function Changegroupnames(){
        var sheet = SpreadsheetApp.getActiveSheet()
        replaceInSheet(sheet,'GROUP 01 - 04 TOTALS','NRS EAST - CITY 01 HEADQUARTERS'),
        replaceInSheet(sheet,'GROUP 03 - 04 TOTALS','NRS EAST - CITY 03 BASE'),
        replaceInSheet(sheet,'GROUP 04 - 04 TOTALS','NRS EAST - CITY 04 BASE'),
        replaceInSheet(sheet,'GROUP 09 - 04 TOTALS','NRS EAST - CITY 09 BASE'),
          replaceInSheet(sheet,'GROUP 10 - 02 TOTALS','NRS WEST - CITY 10 HEADQUARTERS'),
        replaceInSheet(sheet,'GROUP 06 - 02 TOTALS','NRS WEST - CITY 06 BASE'),
          replaceInSheet(sheet,'GROUP 02 - 01 TOTALS','NRS NORTH - CITY 02 HEADQUARTERS'),
        replaceInSheet(sheet,'GROUP 05 - 01 TOTALS','NRS NORTH - CITY 05 BASE'),
        replaceInSheet(sheet,'GROUP 07 - 03 TOTALS','NRS SOUTH - CITY 07 HEADQUARTERS'),
        replaceInSheet(sheet,'GROUP 07 - 03 TOTALS','NRS SOUTH - CITY 08 BASE')
        ;
    }
    
    function replaceInSheet(sheet, to_replace, replace_with) {
      //get the current data range values as an array
      var values = sheet.getDataRange().getValues();
    
      //loop over the rows in the array
      for(var row in values){
    
        //use Array.map to execute a replace call on each of the cells in the row.
        var replaced_values = values[row].map(function(original_value){
          return original_value.toString().replace(to_replace,replace_with);
        });
    
        //replace the original row values with the replaced values
        values[row] = replaced_values;
      }
    
      //write the updated values to the sheet
      sheet.getDataRange().setValues(values);
    }
    
    function movingROWS(){
    var sheet = SpreadsheetApp.getActiveSheet()
     sheet.getRange("=$C2='City1'").moveTo(sheet.getRange("A502"));
     }

编辑

正如@lamblichus 所要求的,我会尽量让它在视觉上更清晰。我无法添加图像,但我会添加指向它们的链接。希望它更容易理解。

因为它在第一张图片中可见,我有一个名为“第二个标识符”的列,后跟一个名为“第一个标识符名称”的列。我需要将工作表中具有相同第二个标识符编号的分组行排序在一起。

图片 01 - https://drive.google.com/file/d/1_LmYFE9jRGPD6VdOnp0cd1kjaCoysS7g/view?usp=sharing

每个单独的组必须一起移动,包括正下方包含该组总数的行。

使工作表看起来像这样:

图片 02 - https://drive.google.com/file/d/1mirRDEZRqmyWCLVrqT3KU5rFeFRLs4ar/view?usp=sharing 图片 03 - https://drive.google.com/file/d/1MzhwWOtf6jFjRkdXdRWbCZkZ5frprUX8/view?usp=sharing

然后,在属于第二个标识符组的最后一组之间添加一个空白行。

我希望我说得更清楚一点。

【问题讨论】:

  • 您能否直观地阐明数据的当前结构以及期望的结果是什么?根据您提供的信息,我不清楚。
  • 您提供了链接的三张图片中,只有最后一张可以访问。您可以将它们全部公开吗?
  • 我很抱歉@lamblichus,只是这样做了。我以为我改变了所有图像。希望您现在可以访问它们

标签: google-apps-script google-sheets


【解决方案1】:

您可以执行以下操作:

  • 声明一个空的二维数组 (groups),其中所有不同的组都将被分类(group 是具有第一个和第二个标识符的唯一组合的行)。
  • 循环遍历每一行数据。
  • 对于每一行,将该行附加到groups 中的最后一个内部数组。
  • 对于每一行,检查 B 列是否为空。如果是这种情况,请将新数组附加到 groups
  • 声明一个空数组 (outerGroups),将在其中对具有相同第二个标识符的每组组进行分组。
  • 循环通过groups
  • 对于每个group,检查是否存在具有第二个标识符的outerGroup(您可以为此使用find)。
  • 如果找到匹配项,请将group 添加到找到的outerGroup。否则,请创建一个包含此 group 的新 outerGroup
  • 修改 outerGroups 以连接其间的空白行,并使用 flat() 将其转换为二维数组。
  • 通过Range.setValues设置结果值。

代码sn-p:

// Copyright 2021 Google LLC.
// SPDX-License-Identifier: Apache-2.0

function sortGroups() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const firstRow = 3;
  const numCols = sheet.getLastColumn();
  const range = sheet.getRange(firstRow, 1, sheet.getLastRow()-firstRow+1, numCols);
  const values = range.getValues();
  const totalsRow = values.pop();
  let groups = [[]];
  values.forEach((row, i) => {
    groups[groups.length - 1].push(row);
    if (!row[1] && i < values.length-1) {
      groups.push([]);
    }
  });
  let outerGroups = [];
  groups.forEach(group => {
    const outerGroup = outerGroups.find(outerGroup => {
      return outerGroup[0] && outerGroup[0][0] && outerGroup[0][0][1] === group[0][1];
    });
    if (outerGroup) outerGroup.push(group);
    else outerGroups.push([group]);
  });
  outerGroups = outerGroups.map(outerGroup => outerGroup.flat())
                           .map(outerGroup => outerGroup.concat([new Array(numCols)]))
                           .flat()
                           .concat([totalsRow]);
  sheet.getRange(firstRow, 1, outerGroups.length, outerGroups[0].length).setValues(outerGroups);
}

【讨论】:

  • 我亲爱的朋友,你拯救了我的一天,甚至有时间教我很多关于如何使这些成为可能的知识。我很感激。如果可能的话会给你一杯啤酒。谢谢!
猜你喜欢
  • 2018-11-16
  • 2023-02-10
  • 2013-09-06
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多