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



我有一张名为";基片";采用以下格式

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

I根据";订单号";和sum";重量;并填充在称为";重量;

Order#    Total_Weight    Deleted_Status
1213       912
3450       333
3451       444

我用"0"进行分组和求和;ALASQL";图书馆

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

我的挑战是;订单号";从";基片";则相应的";订单号";在";重量;片材应该具有";Deleted_Status";作为";是的";。

假设我们删除订单";3451";从基片开始;重量;纸张必须是

Order#    Total_Weight    Deleted_Status
1213       912
3450       333
3451       444            Yes

不知道如何在谷歌应用程序脚本中动态实现此逻辑。如有任何建议,我们将不胜感激。

我相信你的现状和目标如下。

  • 您在Google电子表格中有两张表格。
    • 一个是图纸名称为Base Sheet的图纸
    • 另一种是具有图纸名称Weight的图纸
  • 当";订单号";如果从Base Sheet中删除了CCD_;C";相同的";订单号";在片材CCD_ 5中
  • 您希望在删除单元格值和行时运行脚本
  • 你想使用谷歌应用程序脚本来实现你的目标

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

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

示例脚本如下。

示例脚本:

请将以下脚本复制并粘贴到谷歌电子表格的脚本编辑器中。而且,如果您不仅要检测手动删除的单元格值,还要检测手动删除行,请将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 SheetWeight。这些是你的问题。如果这些表单名称与您的实际情况不同,请修改以上脚本

注意:

  • 在这个示例脚本中,我准备检测手动删除的单元格值和手动删除的行。因此例如当3451在";基片";Yes被置于列"0";C";的";3451";在";重量";。并且当CCD_;基片";从列"0"中删除Yes;C";的";3451";在";重量";。
    • 如果您不想删除CCD_ 13;订单号";是添加的,请告诉我
  • 此示例脚本由触发器运行。因此,当您直接运行函数onEdit时,会发生错误。请小心。当您想要运行脚本时,请手动删除"订单号";在片材"中;基片">

参考文献:

  • 简单触发器
  • 可安装触发器

由于现有脚本正在将订单和组合权重复制到"重量;表,你能不能不只是使用表内公式来产生";Deleted_Status";柱

例如,假设您的";订单号";以及";重量;"基本表"中的列在A:B中;订单号";以及";总重量;"权重"表中的列也在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

最新更新