【问题标题】:Is it possible to write a script for this Vlookup error?是否可以为此 Vlookup 错误编写脚本?
【发布时间】:2019-12-02 13:43:40
【问题描述】:

我有三个相互关联的 google sheet 电子表格。在工作表“输入数据”中定义了名称和不同的角色。 在表格“分配”中,这些特定名称被分配了值:我在位置上使用以下公式: =IF(C2<>"", VLOOKUP(C2,'Input Data'!C$3:D$7,2,FALSE),"")

在表格“评估”中进行评估。问题是,如果从“输入数据”中删除了名称(例如:Green、John)但仍在“分配”中,则此公式的“评估”工作表上会出现以下错误:

=ARRAY_CONSTRAIN(ARRAYFORMULA(SUM(IF((IF($B$2="dontcare",1,REGEXMATCH(Assignment!$E$3:$E$577,$B$2 &"*")))*(IF($B$3="dontcare",1,(Assignment!$E$3:$E$577=$B$3)))*(IF($B$4="dontcare",1,(Assignment!$D$3:$D$577=$B$4)))*(IF($B$5="dontcare",1,(Assignment!$F$3:$F$577=$B$5)))*(IF($B$6="dontcare",1,(Assignment!$B$3:$B$577=$B$6))),(Assignment!S$3:S$577)))), 1, 1)

错误:评估 VLOOKUP 时,未找到值“Green, John”。 是否可以使用从分配表中删除不在输入数据表中的名称的宏来避免此错误?您对代码有任何想法吗?所以我唯一的问题是,如何编写一个脚本来删除分配列表中的完整行,如果一行出现的名称像 Green,John,它不在输入数据列表中。简短版:示例!作业表:第 7 行 Green, John -> 检查 Green, John 是否在 C 行的表输入数据中!如果绿色,约翰不在输入数据行 C -> 删除第 7 行绿色,约翰在分配中! ....这基本上是我的问题! 带有进一步解释的示例表:https://docs.google.com/spreadsheets/d/1OU_95Lhf6p0ju2TLlz8xmTegHpzTYu4DW0_X57mObBc/edit#gid=1763280488

【问题讨论】:

  • 为什么不构建一个包含 3 张纸的简单示例表并向我们展示您想要发生的事情……您的公式对我们毫无用处,因为它看起来像您有未定义的函数。
  • 这些函数名称是德语。我花了一秒钟才意识到。是的,使用样本数据解决这个问题会容易得多。我也认为 Apps Script 可能比使用内置公式更容易解决这个问题。
  • 您好,能否提供更多关于您的数据和您使用的功能的信息?非常感谢!
  • 我拍了一张样张照片并稍微编辑了问题!你现在能帮帮我吗? @carlesgg97
  • 我拍了一张样张照片并稍微编辑了问题!你现在能帮帮我吗? @CodeCamper

标签: google-apps-script google-sheets vlookup google-sheets-formula


【解决方案1】:

此处提供了使用 Apps 脚本解决您的问题的方法。 该算法的工作原理是遍历两列,比较每一列的值,然后删除不需要的行。

function checkCol() {
  
  
  var s1 = SpreadsheetApp.getActive().getSheetByName("Input data");
  var col1 = s1.getRange("C3:C").getValues();
  
  var s2 = SpreadsheetApp.getActive().getSheetByName("Assignment");
  var col2 = s2.getRange("B3:B").getValues();
  
  for (var i=col2.length-1; i>=0; i--) {
    var found = false;
    for (var j=0; j<col1.length; j++) {
       if (col1[j][0] == col2[i][0]) {
         found = true;
         break;
       }
    }
    
    if (!found) {
      s2.deleteRow(i+3);
    }
  }
}

如果您想将此函数用作工作表的宏,您应该这样做(根据Google Sheets Macros documentation

在 Apps 脚本中创建宏

  1. 在 Google 表格 UI 中,选择工具 > 脚本编辑器以在 Apps 脚本编辑器中打开绑定到工作表的脚本。
  2. 编写宏函数。宏函数不应接受参数且不返回任何值。
  3. 编辑脚本清单以创建宏并将其链接到宏函数。为其分配一个唯一的键盘快捷键和名称。
  4. 保存脚本项目。然后该宏就可以在工作表中使用了。
  5. 测试工作表中的宏函数以验证其功能是否符合预期。

将函数作为宏导入时,应遵循以下步骤:

将函数作为宏导入

  1. 在 Google 表格 UI 中,选择工具 > 宏 > 导入。
  2. 从显示的列表中选择一个函数,然后单击添加函数。
  3. 选择清除关闭对话框。
  4. 选择工具 > 宏 > 管理宏。
  5. 在列表中找到刚刚导入的函数。为宏分配唯一的键盘快捷键。您也可以在此处更改宏名称;名称默认为函数的名称。
  6. 点击更新保存宏配置。

您可以在此处阅读有关 Apps 脚本和此解决方案中使用的主要方法的更多信息:

  1. Class Sheet;

  2. Google Sheets Macros.

【讨论】:

  • 谢谢你!我会在 2 小时内尝试并告诉你它是否有效! :)
  • 它删除了该行之上的行,应该被删除,所以是错误的行。哪里错了?@ale13
  • 您好@greenster10,根据您使用的工作表,您可能需要调整参数。该代码适用于您提供的两个示例表(C3:C 因为“输入数据”表具有来自 C1:C2 的标题,而 B3:B 因为“分配”表具有来自 B1:B2 的标题)。所以我问你,你是否修改了我提供的代码 sn-p 的任何范围?如果是这样,您应该相应地调整这行代码中的数字(s2.deleteRow(i+3);)。
  • 在原始表格中它是Assignment中的C3:C和输入数据中的C4:C,那么(s2.deleteRow(i+3);)如何看待? (i+4)?
  • 是的@greenster10,就是这样!干杯!
猜你喜欢
  • 2011-07-13
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
相关资源
最近更新 更多