【问题标题】:How to link various Google spreadsheets using IMPORTRANGEs that contain VLOOKUP formulas without getting #N/A returned?如何使用包含 VLOOKUP 公式的 IMPORTRANGE 链接各种 Google 电子表格而不返回 #N/A?
【发布时间】:2014-09-29 11:46:24
【问题描述】:

问题:

当使用IMPORTRANGE 从不同的电子表格中提取数据时,原始电子表格中包含包含 VLOOKUP 的公式的单元格通常(但并非总是)返回#N/A (ERROR: Did not find value 'xxx' in VLOOKUP evaluation)。在原始表中,公式计算正确并显示了一个值。这并不总是发生,有时它确实会引入正确的值。

意图:

要从不同的电子表格中获取数据,请将它们合并到不同的电子表格中并对其进行一些计算。然后将此计算电子表格(或多个计算电子表格)中的信息提取到报告电子表格中,以进行进一步的计算和格式化。

设置:

有几个源数据电子表格,例如 dataspreadsheet1dataspreadsheet2dataspreadsheet3。创建计算电子表格 (calcspreadsheet),在每个数据电子表格中创建 sheet1 的副本,并将这些工作表分别命名为 datasheet1datasheet2datasheet3。用于此的IMPORTRANGE 语句创建如下:importrange(+VLOOKUP("dataspreadsheet1",filelist!A1:C1000,3,FALSE),"sheet1!a1:Z1000") 其中 filelist!A1:C1000calcspreadsheet 中的一个工作表,在各个列中包含名称、类型和 ID。

每个工作表datasheet1-3 中的值随后用于另一个工作表中的计算,calcsheet1calcspreadsheet 中。由于这样做的主要目标是从 3 个dataspreadsheets 中累加每日值,但那些sourcesheets 在同一行上并不都有相同的数据,所以再次使用VLOOKUP 以确保添加日期使用datasheet1-3 中的日期行,无论其行号如何。例如。 VLOOKUP($A11,'datasheet1'!$A:$P,4) + VLOOKUP($A11,'datasheet2'!$A:$P,4) + VLOOKUP($A11,'datasheet3'!$A:$P,4) 其中 A 列是所有工作表中的日期列。

这似乎工作正常,虽然打开calcspreadsheet 可能需要很长时间才能完成更新,在此期间会显示很多#N/A。最终它还是正确的。

当创建reportspreadsheet 时会出现问题,该IMPORTRANGE 调用从calcsheet1 中提取信息以便能够使用它。这通常但并非总是会导致一开始就出现问题状态。此reportspreadsheet 中的IMPORTRANGE 调用的生成方式与calcspreadsheet 中的类似:=importrange(+VLOOKUP(calc!B1,sheetcodes!A1:C3000,3,FALSE),"sheet1!a1:Z1000") 其中calc!B1 包含源电子表格的名称(在此calc 中将是'calcspreadsheet'并且sheetcodes!A1:C3000 再次包含一个工作表列表,其中NameTypeId 在各自的列中

我尝试过的解决方法:

我注意到IMPORTRANGE 在不包含VLOOKUP 的单元格上效果更好所以我尝试将calcsheet 的内容复制到calcspreadsheet 中的另一张纸上,名为exportsheet 但只有值在那里,不是公式,然后在这个exportsheet 上使用IMPORTRANGE。使用的复制脚本如下:

function exportPrep() {
  // Get the active spreadsheet and the active sheet
  //var ss = SpreadsheetApp.getActiveSpreadsheet();
  //var sheet = ss.getSheetByName("stream");
  //sheet.activate();

  var source = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("calcsheet");
  var sourceDataRange = source.getDataRange();
  var sourceSheetValues = sourceDataRange.getValues();
  var sourceRows = sourceDataRange.getNumRows();
  var sourceColumns = sourceDataRange.getNumColumns();

  var destination = SpreadsheetApp.getActiveSpreadsheet();
  SpreadsheetApp.setActiveSheet(destination.setActiveSheet("exportsheet"));
  destination.getDataRange().offset(0, 0, sourceRows, sourceColumns).setValues(sourceSheetValues);
      }

这似乎可行,但不幸的是,用于将 calcsheet 的值复制到 exportsheet 的复制脚本现在显示相同的行为,它有时会起作用,有时会给出#N/A,所以给我留下了同样的问题。

我的问题:

我已经阅读了各种具有类似问题和回复的帖子,其中提到此功能是喜怒无常或有错误。其他人说不可能在IMPORTRANGE 中使用动态引用。鉴于它有时有效,有时无效,我怀疑该功能本身可能是正确的,但设置中存在同步或超时问题。

如何设置上述功能。要么使用 IMPORTRANGEVLOOKUP 并进行一些更改/添加,要么以不同于一开始的方式构建。

【问题讨论】:

  • 您使用的是旧式还是新式谷歌表格? ...您还可以确认 #N/A 的原因是 vlookup/importrange 而不是自定义函数,因为每次我看到这个,原因都是自定义函数。

标签: google-apps-script google-sheets gs-vlookup importrange


【解决方案1】:

所以我没有使用 importrange 完成此操作,但是当我遇到 Vlookup 问题时,我将 vlookup 包装在 IF 中并测试 #N/A。
尝试类似:=IF(ISNA(VLOOKUP(...)),"",VLOOKUP(...))

【讨论】:

    【解决方案2】:

    =IFERROR(VLOOKUP(B81,'KAM_Q3_OPPS STAGE_(H/I/L/M/N)'!$F$3:$G$111,2,False),)

    这是我发现的最好的方法,最后两个值[ , ) ] 产生新的输出,在这种情况下它什么都不是。

    如果你想输入 0,那么你会做 [ ,0) ]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多