我有一张名为“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 脚本中动态实现此逻辑。任何建议将不胜感激。
答案 0 :(得分:2)
我相信你现在的情况和你的目标如下。
Base Sheet
的工作表。Weight
的工作表。Base Sheet
中删除“Order#”的值时,您希望将Yes
的值放入表{{中相同“Order#”的“C”列中1}}。在这种情况下,我想建议如下使用触发器。
示例脚本如下。
请将以下脚本复制并粘贴到 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
工作表名称。这些来自你的问题。如果这些工作表名称与您的实际情况不同,请修改上述脚本。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
。