动态填充谷歌应用程序脚本中的文件

时间:2021-05-04 02:39:30

标签: google-apps-script google-sheets

我有一张名为“Base Sheet”的工作表,格式如下

 Order#    Weight
 1213      345
 1213      567
 3450      111
 3450      222
 3451      444

我根据“订单编号”分组,然后将“重量”相加并填充到名为“重量”的工作表中

Order#    Total_Weight    Deleted_Status
1213       912
3450       333
3451       444

我使用“ALASQL”库进行分组和求和。

var res_1 = alasql('SELECT [0] as Order#, sum([1]) as Total_Weight FROM ? GROUP BY [0]',[row]);

我的挑战是,如果“订单号”从“基本表”中完全删除,那么“重量”表中相应的“订单号”应将“Deleted_Status”设为“是”。

假设我们从 Base sheet 中删除 Order# "3451",然后在 "Weight" 表中它必须是

Order#    Total_Weight    Deleted_Status
1213       912
3450       333
3451       444            Yes

不确定如何在 Google Apps 脚本中动态实现此逻辑。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

我相信你现在的情况和你的目标如下。

  • 您在 Google 电子表格中有 2 张工作表。
    • 一个是工作表名称为 Base Sheet 的工作表。
    • 另一个是工作表名称为 Weight 的工作表。
  • 当从Base Sheet中删除“Order#”的值时,您希望将Yes的值放入表{{中相同“Order#”的“C”列中1}}。
  • 您想在单元格值被删除并删除行时运行脚本。
  • 您希望使用 Google Apps 脚本实现您的目标。

在这种情况下,我想建议如下使用触发器。

  • 为了检测手动删除的单元格值,使用了 OnEdit 的简单触发器。
  • 为了检测手动删除的行,使用了 OnChange 的可安装触发器。

示例脚本如下。

示例脚本:

请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。而且,如果您不仅要检测手动删除的单元格值,还要检测手动删除的行,please install the OnChange trigger to the function onEdit

Weight
  • 在此脚本中,使用了 function onEdit(e) { const sheet = e.source.getActiveSheet(); if (sheet.getSheetName() != "Base Sheet") return; const obj = sheet.getRange(2, 1, sheet.getLastRow() - 1).getValues().reduce((o, [a]) => Object.assign(o, {[a]: true}), {}); const sheetWheight = e.source.getSheetByName("Weight"); const values = sheetWheight.getRange(2, 1, sheetWheight.getLastRow() - 1).getValues().map(([a]) => [obj[a] ? "" : "Yes"]); sheetWheight.getRange(2, 3, values.length, 1).setValues(values); } Base Sheet 工作表名称。这些来自你的问题。如果这些工作表名称与您的实际情况不同,请修改上述脚本。

注意:

  • 在这个示例脚本中,我准备检测手动删除的单元格值和手动删除的行。因此,例如,当删除“Base Sheet”中的 Weight 时,将 3451 放在“Weight”中“3451”的“C”列中。而且,当添加“Base Sheet”中的 Yes 时,3451 从“Weight”中“3451”的“C”列中删除。
    • 如果您不想删除 Yes,即使添加了相同的“Order#”,请告诉我。
  • 此示例脚本由触发器运行。所以当你直接运行函数Yes时,会出现错误。请注意这一点。当您要运行脚本时,请手动删除“Base Sheet”表中的“Order#”。

参考:

答案 1 :(得分:0)

由于现有脚本正在将订单和组合权重复制到“权重”表中,您能否仅使用表内公式来生成“Deleted_Status”列的结果?

例如,假设“Base Sheet”中的“Order#”和“Weight”列在 A:B 中,“Weight”表中的“Order#”和“Total_Weight”列也在 A 中: B,并且“Deleted_Status”列是 Weight!C:C。您可以将以下公式放在其他空的 C 列的 C1 中:

=ArrayFormula({"Deleted_Status"; IF(A2:A="",,IF(NOT(ISERROR(VLOOKUP(A2:A,'Base Sheet'!A:A,1,FALSE))),,"Yes"))})

此公式在第一个单元格中创建标题。如果单元格 A2:A(在当前“重量”表中)为空白,则 C2:C 中的相应单元格保持为空。否则,如果在“基本表”的 A 列(即 IF(NOT(ISERROR(VLOOKUP)中找到该单元格的值,则该单元格保持为空。如果它一个错误(即,如果在那里找不到 A2:A 值),则结果是 Yes

相关问题