首页 > 解决方案 > 根据来自另一个特定单元格范围的值从特定范围删除谷歌电子表格中的行

问题描述

我的脚本需要一点帮助。

首先,这里是 ss 的链接:https ://docs.google.com/spreadsheets/d/1TgG64irjoxkV9wKlT5bEnaNEWlGyOlNxVoLxOmQZ2BA/edit?usp=sharing

我想根据工作表“概览”(范围:C4:C12)中的值从工作表“团队 1”(范围:A15:A41)中删除行。

基本上,如果在 A15:A41 中找到 C4:C12 中的任何值,则应删除找到的行。

前任。对于我的 ss:C4 = 3,这意味着在工作表“Team 1”中,应删除第 17 行。

到目前为止我的脚本:

function deleteRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getSheetByName('Overview');
  var s2 = ss.getSheetByName('Team 1');
  var r1 = s1.getRange("C4:C12");
  var v1 = r1.getValues();
  var r2 = s2.getRange("A2:A28");
  var v2 = r2.getValues();

for (var i = v2.length - 1; i >= 0; i--)
  if (v2[i][0] == v1)
    s2.deleteRow(i + 2);
};

我不知道如何让它来比较整个范围内的数据,而不仅仅是来自单个单元格。

谢谢。

标签: google-apps-scriptgoogle-sheets

解决方案


我相信你的目标如下。

  • 您想通过将工作表Team 1中的单元格“C4:C12”与工作表Overview中的单元格“A2:A28”进行比较来删除工作表的行Team 1

对于这个,这个修改怎么样?

修改点:

  • 在这种情况下,需要比较“C4:C12”和“A2:A28”的所有值。但是当每个值v2与循环中的所有值进行比较时v1,处理成本会很高。因此,首先,它创建一个用于搜索值的对象,并使用该对象运行搜索。

当你的脚本被修改后,它变成如下。

修改后的脚本:

从:
for (var i = v2.length - 1; i >= 0; i--)
  if (v2[i][0] == v1)
    s2.deleteRow(i + 2);
到:
var obj = v1.reduce((o, [e]) => (Object.assign(o, {[e]: true})), {});
for (var i = v2.length - 1; i >= 0; i--)
  if (obj[v2[i][0]])
    s2.deleteRow(i + 2);

参考:


推荐阅读