如何使用包含VLOOKUP公式的IMPORTRANGE链接各种Google电子表格而不返回#N / A?

时间:2014-09-29 11:46:24

标签: google-apps-script google-sheets google-spreadsheet-api gs-vlookup

问题:

当使用IMPORTRANGE从不同的电子表格中提取数据时,原始电子表格中包含含有VLOOKUP的表格的单元格经常(但不总是)返回#N / A(错误:在VLOOKUP评估中未找到值'xxx') 。在原始图纸中,公式正确计算并显示值。这并不总是会发生,有时它会提取适当的值。

意图:

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

设置:

有几个源数据电子表格,例如dataspreadsheet1,dataspreadsheet2和dataspreadsheet3。创建计算电子表格(calcspreadsheet),在每个数据电子表格中创建sheet1的副本,并分别命名这些表格datasheet1,datasheet2和datasheet3。用于此目的的IMPORTRANGE语句创建如下:importrange(+ VLOOKUP(“dataspreadsheet1”,filelist!A1:C1000,3,FALSE),“sheet1!a1:Z1000”)其中 filelist!A1:C1000是calcspreadsheet中的一个工作表,其中包含各列中的Name,Type和Id。

然后,将这些工作表中每个数据表1-3中的值用于另一个工作表(计算表单中的calcsheet1)中的计算。由于这个主要目标是从3个数据表格中添加每日值,但这些源表并不是在同一行上都具有相同的数据,再次使用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中提取信息以便能够使用它。这通常(但并非总是)导致问题状态在开始时。此报告表格中的IMPORTRANGE调用以与calcspreadsheet中类似的方式生成:= importrange(+ VLOOKUP(calc!B1,sheetcodes!A1:C3000,3,FALSE),“sheet1!a1:Z1000”)其中calc! B1包含源电子表格的名称(在此计算中将是'calcspreadsheet'和表单代码!A1:C3000再次包含在各列中具有名称,类型和标识的表单列表

我尝试过的解决方法:

我注意到IMPORTRANGE在不包含VLOOKUP的单元格上效果更好因此我尝试将calcsheet的内容复制到calcspreadsheet中的另一个表单,称为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留下同样的问题。< / p>

我的问题:

我已经阅读了各种类似问题和回复的帖子,提到这个功能很有气质或有bug。其他说明在IMPORTRANGE中不可能使用动态参考。鉴于它有时有效,有时我不怀疑功能本身可能是正确的,但设置中存在同步或超时问题。

How can I set up the above functionality. Either with the use of IMPORTRANGE and VLOOKUP at all with some changes/additions, or built in a different way from the get-go. 

2 个答案:

答案 0 :(得分:0)

所以我没有用importrange做到这一点,但是当我遇到Vlookup的这个问题时,我将vlookup包装在IF中并测试#N / A. 尝试类似:= IF(ISNA(VLOOKUP(...)),“”,VLOOKUP(...))

答案 1 :(得分:0)

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

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

如果您想输入0,那么您可以进行[ ,0) ]