Google apps script 可以为这个Vlookup错误编写脚本吗?

Google apps script 可以为这个Vlookup错误编写脚本吗?,google-apps-script,google-sheets,vlookup,google-sheets-formula,Google Apps Script,Google Sheets,Vlookup,Google Sheets Formula,我有三个相互关联的谷歌电子表格。在工作表“输入数据”中定义了名称和不同的角色。 在“分配”表中,这些特定名称被分配了值:我在位置上使用以下公式: =IF(C2“”,VLOOKUP(C2,'Input Data'!C$3:D$7,2,FALSE),”) 在“评估”表中进行评估。问题在于,如果从“输入数据”中删除了一个名称(例如:Green,John),但仍处于“分配”中,则此公式的“评估”工作表上会出现以下错误: 错误:评估VLOOKUP时,未找到值“Green,John”。 如果宏从输入数据

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

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

错误:评估VLOOKUP时,未找到值“Green,John”。 如果宏从输入数据表中不存在的工作分配表中删除名称,是否可以避免此错误?你对代码有什么想法吗?所以我唯一的问题是,如果输入数据列表中没有一行名为Green,John,那么如何编写一个脚本来删除赋值列表中的完整行。简短版本:示例!作业单:第7行绿色,John->检查是否绿色,John在C行的工作表输入数据中!如果绿色,John不在输入数据行C->删除第7行绿色,John在分配中。。。。这基本上是我的问题!
带有进一步说明的示例表:

此处提供了使用应用程序脚本解决问题的方法。 该算法的工作原理是在两列之间循环,比较每一列的值,然后删除不需要的行

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);
    }
  }
}
函数checkCol(){
var s1=SpreadsheetApp.getActive().getSheetByName(“输入数据”);
var col1=s1.getRange(“C3:C”).getValues();
var s2=SpreadsheetApp.getActive().getSheetByName(“分配”);
var col2=s2.getRange(“B3:B”).getValues();
对于(var i=col2.length-1;i>=0;i--){
var=false;
用于(var j=0;j脚本编辑器)在应用程序脚本编辑器中打开绑定到工作表的脚本
  • 编写宏函数。宏函数不应接受任何参数,也不应返回任何值
  • 编辑脚本清单以创建宏并将其链接到宏功能。为其指定唯一的键盘快捷键和名称
  • 保存脚本项目。然后宏可在工作表中使用
  • 测试工作表中的宏功能,以验证其功能是否符合预期
  • 将函数作为宏导入时,应遵循以下步骤:

    将函数作为宏导入

  • 在Google Sheets UI中,选择工具>宏>导入
  • 从显示的列表中选择一个函数,然后单击“添加函数”
  • 选择“清除”关闭对话框
  • 选择工具>宏>管理宏
  • 在列表中找到刚导入的函数。为宏指定唯一的键盘快捷键。您也可以在此处更改宏名称;该名称默认为函数的名称
  • 单击“更新”保存宏配置
  • 您可以在此处阅读有关应用程序脚本和此解决方案中使用的主要方法的更多信息:

  • )


  • 为什么不创建一个包含3张表的简单示例表,并向我们展示您希望发生的事情……您的公式对我们来说毫无用处,因为它看起来像您有未定义的函数。这些函数名是德语的。我花了一秒钟才意识到。是的,使用示例数据解决此问题会容易得多。我还认为应用程序脚本可能是ea我不想使用内置公式来解决这个问题。您好,您能提供更多关于您的数据和您使用过的函数的信息吗?非常感谢!我拍了一张示例表的照片并对问题进行了一点编辑!您现在能帮我吗?@carlesgg97I拍摄了一张示例表的照片并对问题进行了一点编辑!您能帮我吗请现在帮帮我?@CodeCamperThank你这个家伙!我会在2小时内试试,然后告诉你它是否有效!:)它删除了该行上的行,该行应该被删除,因此是错误的行。错误在哪里?@ale13Hello@greenster10,根据您使用的工作表,您可能需要调整参数。该代码适用于您提供的两个示例工作表(C3:C因为“输入数据”表有C1:C2的标题,B3:B因为“分配”表有B1:B2的标题)。所以我问你,你是否修改了我提供的代码片段中的任何范围?如果是,你应该修改这行代码中的数字(
    s2.deleteRow(I+3);
    )因此,在原始工作表中,赋值是C3:C,输入数据是C4:C,那么
    (s2.deleteRow(i+3);)
    看起来如何?(i+4)?是@greenster10,就是这样!干杯!
    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);
        }
      }
    }