Google 执行索引匹配功能的 Apps 脚本给出数组 [0].length = undefined,尽管其格式为 [[value],[value]...]
Google Apps Script doing Index Match function gives array[0].length = undefined despite being in form [[value], [value]...]
我正在使用 Google Apps 脚本在同一个电子表格中的 2 个工作表上执行索引匹配功能,并且我已经调整了 this post 中的代码。
但是,当我尝试使用找到的数组设置值 () 时,出现此错误:
异常:数据中的列数与范围中的列数不匹配。数据有 0 但范围有 1.
我查看了使用函数创建的数组(已找到),它与 [[value]、null、[value]、...、[value]] 的正确维度相匹配。谁能解释为什么会这样,以及如何解决它的任何想法?是因为数组中有空值吗?
请注意,sourcedata table 比 find table 有更多的行,并且有些行没有查找值,我想要一个空值。我可以使用 createTextfinder 函数执行此函数,但它不如使用 2 个 for 循环创建数组高效。或者我应该探索更好的替代方案?
function indexMatch() {
var basesheet = SpreadsheetApp.getActive().getSheetByName("source");
var sheet = SpreadsheetApp.getActive().getSheetByName("findtable");
var found = [];
var searchData = basesheet.getDataRange().getValues();
var findData = sheet.getDataRange().getValues();
for (i = 0; i < findData.length; i++) {
for (j = 0; j < searchData.length; j++) {
var find = findData[i][5];
var searchref = searchData[j][19];
if (find == searchref && find != "") {
found[[i]] = [searchData[j][8]];
}
}
}
Logger.log(found);
sheet.getRange(1, 7, found.length, 1).setValues(found)
}
谢谢!
你说你的数组看起来像这样:[[value], null, [value], ..., [value]]
我认为它应该是这样的:[[value], [null], [value], ..., [value]]
试试这个:
function indexMatch() {
var basesheet = SpreadsheetApp.getActive().getSheetByName("source");
var sheet = SpreadsheetApp.getActive().getSheetByName("findtable");
var found = [];
var searchData = basesheet.getDataRange().getValues();
var findData = sheet.getDataRange().getValues();
for (i = 0; i < findData.length; i++) {
for (j = 0; j < searchData.length; j++) {
var find = findData[i][5];
var searchref = searchData[j][19];
if (find == searchref && find != "") {
found.push([searchData[j][8]]);
}
}
}
Logger.log(found);
sheet.getRange(1, 7, found.length, 1).setValues(found)
}
我不太确定,但我认为下面的代码也能正常工作:
function indexMatch() {
var basesheet = SpreadsheetApp.getActive().getSheetByName("source");
var sh = SpreadsheetApp.getActive().getSheetByName("findtable");
var found = [];
var search = basesheet.getDataRange().getValues();
var find = sh.getRange(1, 6, sh.getLastRow()).getValues().flat().filter(e => e);
for (j = 0; j < search.length; j++) {
if(~find.indexOf(search[j][18]))found.push([search[j][8]]);
}
sh.getRange(1, 7, found.length, 1).setValues(found)
}
我正在使用 Google Apps 脚本在同一个电子表格中的 2 个工作表上执行索引匹配功能,并且我已经调整了 this post 中的代码。
但是,当我尝试使用找到的数组设置值 () 时,出现此错误: 异常:数据中的列数与范围中的列数不匹配。数据有 0 但范围有 1.
我查看了使用函数创建的数组(已找到),它与 [[value]、null、[value]、...、[value]] 的正确维度相匹配。谁能解释为什么会这样,以及如何解决它的任何想法?是因为数组中有空值吗?
请注意,sourcedata table 比 find table 有更多的行,并且有些行没有查找值,我想要一个空值。我可以使用 createTextfinder 函数执行此函数,但它不如使用 2 个 for 循环创建数组高效。或者我应该探索更好的替代方案?
function indexMatch() {
var basesheet = SpreadsheetApp.getActive().getSheetByName("source");
var sheet = SpreadsheetApp.getActive().getSheetByName("findtable");
var found = [];
var searchData = basesheet.getDataRange().getValues();
var findData = sheet.getDataRange().getValues();
for (i = 0; i < findData.length; i++) {
for (j = 0; j < searchData.length; j++) {
var find = findData[i][5];
var searchref = searchData[j][19];
if (find == searchref && find != "") {
found[[i]] = [searchData[j][8]];
}
}
}
Logger.log(found);
sheet.getRange(1, 7, found.length, 1).setValues(found)
}
谢谢!
你说你的数组看起来像这样:[[value], null, [value], ..., [value]]
我认为它应该是这样的:[[value], [null], [value], ..., [value]]
试试这个:
function indexMatch() {
var basesheet = SpreadsheetApp.getActive().getSheetByName("source");
var sheet = SpreadsheetApp.getActive().getSheetByName("findtable");
var found = [];
var searchData = basesheet.getDataRange().getValues();
var findData = sheet.getDataRange().getValues();
for (i = 0; i < findData.length; i++) {
for (j = 0; j < searchData.length; j++) {
var find = findData[i][5];
var searchref = searchData[j][19];
if (find == searchref && find != "") {
found.push([searchData[j][8]]);
}
}
}
Logger.log(found);
sheet.getRange(1, 7, found.length, 1).setValues(found)
}
我不太确定,但我认为下面的代码也能正常工作:
function indexMatch() {
var basesheet = SpreadsheetApp.getActive().getSheetByName("source");
var sh = SpreadsheetApp.getActive().getSheetByName("findtable");
var found = [];
var search = basesheet.getDataRange().getValues();
var find = sh.getRange(1, 6, sh.getLastRow()).getValues().flat().filter(e => e);
for (j = 0; j < search.length; j++) {
if(~find.indexOf(search[j][18]))found.push([search[j][8]]);
}
sh.getRange(1, 7, found.length, 1).setValues(found)
}