【问题标题】:Inserting rows with data upon finding certain value in Column B在 B 列中找到特定值时插入带有数据的行
【发布时间】:2021-12-17 18:58:38
【问题描述】:

我的问题有点复杂。我会尽量简化它。 为简单起见,我添加了指向工作表的链接。 Sample Sheet

我有一个大约 10,000 行的大表。我想在 B 列中包含单词“Test 22”的每一行之后插入 9 行。这是第一阶段。我要在这 9 行中填充数据的最重要部分(第二阶段)如下:

  1. A 列(产品名称)单元格将包含与值“Test 22”单元格相邻的第一个单元格相同的产品名称
  2. E 列(空列 2)单元格是 9 个单元格,将包含这些值(结果 1、结果 2、结果 3、结果 4、结果 5、结果 6、平均值、最大值、最小值)。当然,当在 B 列中找到“Test 22”这个词时,这个过程将在整个表格中重复。

我已成功执行阶段 I,即在 B 列中包含“Test 22”一词的每一行之后插入 9 个空白行,但我无法执行阶段 II。我不知道这个功能是否可以在 1 步或 2 步中完成。 您的帮助将不胜感激。 谢谢

【问题讨论】:

  • 通过共享电子表格,请注意your email address can be accessed by the public。相反,请使用tables。您可以使用公式轻松创建表格:=ARRAYFORMULA("|"&A1:G20),如果您想共享A1:G20。但是,第一行 A1:G1 必须是标题行,第二行 A2:G2 应该只在所有单元格中包含破折号 --
  • 嗨,亲爱的尤里,我没有跑我在这里

标签: google-apps-script google-sheets


【解决方案1】:

可能是这样的:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var new_data = [];

  for (var row in data) {
    new_data.push(data[row]);
    if (data[row][1] == 'Test 22') {
      new_data.push([data[row][0],'','','','Result 1']);
      new_data.push([data[row][0],'','','','Result 2']);
      new_data.push([data[row][0],'','','','Result 3']);
      new_data.push([data[row][0],'','','','Result 4']);
      new_data.push([data[row][0],'','','','Result 5']);
      new_data.push([data[row][0],'','','','Result 6']);
      new_data.push([data[row][0],'','','','Average']);
      new_data.push([data[row][0],'','','','Max']);
      new_data.push([data[row][0],'','','','Min']);
    }
  }

  sheet.getRange(1,1,new_data.length,new_data[0].length,).setValues(new_data);
}

或者,使用较少冗长符号的相同算法:

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var new_data = [];
  var col_e = ['Result 1','Result 2','Result 3','Result 4',
    'Result 5','Result 6','Average','Max','Min'];

  for (let row of data) {
    new_data.push(row);
    if (row[1] == 'Test 22') {
      col_e.forEach(e => new_data.push([row[0],'','','',e]));
    }
  }

 sheet.getRange(1,1,new_data.length,new_data[0].length,).setValues(new_data);
}

更新

格式化列F的函数:

function format_column_F() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var column = sheet.getRange('E:E').getValues().flat();
  var formats = new Array(9).fill(['0.00 %']);
  var row = 0;

  while (row++ < column.length) {
    if (column[row] == 'Result 1') {

      let range = `F${row+1}:F${row+6}`;
      let formulas = [[`=AVERAGE(${range})`],[`=MAX(${range})`],[`=MIN(${range})`]];

      sheet.getRange(`F${row+7}:F${row+9}`).setFormulas(formulas);
      sheet.getRange(`F${row+1}:F${row+9}`).setNumberFormats(formats);

      row += 9;
    }
  }
}

参考:

【讨论】:

  • 亲爱的 Yuri,我非常感谢您提供快速而专业的解决方案。两者都很适合我,对我帮助很大。再次感谢。我无法投票赞成你的答案,因为我仍然没有投票权。但我确信在接下来的日子里我会非常需要你的支持。
  • 亲爱的 Kero,我很乐意为您提供帮助。而且,据我所知,您总是可以接受您的问题的正确答案meta.stackexchange.com/a/5235/882176 这将是一件好事
  • 你好尤里,又是我。我将从我们刚刚修改的表中查询数据到同一个电子表格中的另一张表中。我想格式化与 e 列相邻的列 ['Result 1','Result 2','Result 3','Result 4','Result 5','Result 6','Average','Max','分钟'];
  • 你好尤里,又是我。我将从我们刚刚修改的表中查询数据到同一个电子表格中的另一张表中。我想格式化列 e ['Result 1','Result 2','Result 3','Result 4','Result 5','Result 6','Average','Max ','敏'];如下:“与结果 1 到结果 6 相邻的前 6 个单元格将采用百分比格式(0.00%)。与“平均”单元格相邻的单元格将计算 6 个结果的平均值,并且也采用 0.00% 格式。与“Min”和“Max”单元格相邻的单元格将包含 6 个结果的最小值和最大值。
  • 我添加了附加功能来格式化列 F。
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
相关资源
最近更新 更多