首页 > 解决方案 > 动态填充谷歌应用程序脚本中的文件

问题描述

我有一张名为“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]);

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

假设我们从基本表中删除订单#“3451”,然后在“重量”表中它必须是

Order#    Total_Weight    Deleted_Status
1213       912
3450       333
3451       444            Yes

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

标签: google-apps-scriptgoogle-sheets

解决方案


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

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

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

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

示例脚本如下。

示例脚本:

请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。而且,如果您不仅要检测手动删除的单元格值,还要检测手动删除的行,请在函数中安装 OnChange 触发器onEdit

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和的工作表名称Weight。这些来自你的问题。如果这些工作表名称与您的实际情况不同,请修改上述脚本。

笔记:

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

参考:


推荐阅读