【发布时间】:2014-09-29 11:46:24
【问题描述】:
问题:
当使用IMPORTRANGE 从不同的电子表格中提取数据时,原始电子表格中包含包含 VLOOKUP 的公式的单元格通常(但并非总是)返回#N/A (ERROR: Did not find value 'xxx' in VLOOKUP evaluation)。在原始表中,公式计算正确并显示了一个值。这并不总是发生,有时它确实会引入正确的值。
意图:
要从不同的电子表格中获取数据,请将它们合并到不同的电子表格中并对其进行一些计算。然后将此计算电子表格(或多个计算电子表格)中的信息提取到报告电子表格中,以进行进一步的计算和格式化。
设置:
有几个源数据电子表格,例如 dataspreadsheet1、dataspreadsheet2 和 dataspreadsheet3。创建计算电子表格 (calcspreadsheet),在每个数据电子表格中创建 sheet1 的副本,并将这些工作表分别命名为 datasheet1、datasheet2 和 datasheet3。用于此的IMPORTRANGE 语句创建如下:importrange(+VLOOKUP("dataspreadsheet1",filelist!A1:C1000,3,FALSE),"sheet1!a1:Z1000") 其中
filelist!A1:C1000 是calcspreadsheet 中的一个工作表,在各个列中包含名称、类型和 ID。
每个工作表datasheet1-3 中的值随后用于另一个工作表中的计算,calcsheet1 在calcspreadsheet 中。由于这样做的主要目标是从 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 再次包含一个工作表列表,其中Name、Type 和Id 在各自的列中
我尝试过的解决方法:
我注意到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 中使用动态引用。鉴于它有时有效,有时无效,我怀疑该功能本身可能是正确的,但设置中存在同步或超时问题。
如何设置上述功能。要么使用
IMPORTRANGE和VLOOKUP并进行一些更改/添加,要么以不同于一开始的方式构建。
【问题讨论】:
-
您使用的是旧式还是新式谷歌表格? ...您还可以确认 #N/A 的原因是 vlookup/importrange 而不是自定义函数,因为每次我看到这个,原因都是自定义函数。
标签: google-apps-script google-sheets gs-vlookup importrange