使用公式修改应用程序脚本数组项
Modifying apps script array items with formulas
我正在尝试 create/modify 基于 CONCATENATE 和 VLOOKUP 公式的数组元素。执行代码时,显示的是公式而不是结果。
目标是获取规范矩阵 sheet 的一部分中的信息,执行 VLOOKUP,并将原始值与相同 sheet 的 C 列中的信息连接起来短跑。如果使用公式,则以下公式有效:=CONCATENATE(P107," - ",VLOOKUP(P107,C:D,2,FALSE))
连接的值将分布在(最多)97 sheets 内sheet,我想自动执行此任务。在脚本中,P107
的公式值被替换为 miniArray[k]
function specToTab() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var specMatrix = spreadsheet.getSheetByName("Specification Matrix");
specMatrix.activate();
var specMatrixArray = spreadsheet.getRangeByName('specMatrixFull').getValues();
//Delete rows that have no specifications and sheets 10A, 11A, 12A
var newArray = specMatrixArray.filter(function(item){return item[1] != "" && item[0] != "10A" && item[0] != "11A" && item[0] != "12A";});
//Iterate through the applicable trades and break apart the arrays
for(var j=0; j<newArray.length;j++){
var miniArray = newArray[j];
//miniSheet is the current trade
var miniSheet = miniArray[0];
for(var i=0; i< miniArray.length; i++){
if(miniArray[i] == ''){
miniArray.splice(i);
}
}
// Delete the trade from the specification array
miniArray.splice(0,1);
// create new array for the concatenate formula
// THIS IS WHERE THE CODE IS NOT WORKING!!!
var pushArray = []
for(var k=0; k<miniArray.length; k++){
var pushItem = "=CONCATENATE(" + miniArray[k] + ",' - ',VLOOKUP(" + miniArray[k] + ",C:D,2,FALSE))";
pushArray.push(pushItem);
}
Logger.log(miniSheet);
Logger.log(miniArray);
Logger.log(pushArray);
}
}
所需的 miniSheet 和 miniArray 输出正确发布。问题是公式不是针对 pushArray 计算的。预期输出是
[Division 00 -
00 40 21 - Prevailing Wage Rates
Division 01 - GENERAL REQUIREMENTS
01 10 00 - Summary
01 21 00 - Allowances
01 22 00 - Unit Prices
02 41 16 - Structure Demolition
02 41 19 - Selective Structure Demolition]
实际输出为:
[=CONCATENATE(Division 00,' - ',VLOOKUP(Division 00,C:D,2,FALSE)),
=CONCATENATE(00 40 21,' - ',VLOOKUP(00 40 21,C:D,2,FALSE)),
=CONCATENATE(Division 01,' - ',VLOOKUP(Division 01,C:D,2,FALSE)),
=CONCATENATE(01 10 00,' - ',VLOOKUP(01 10 00,C:D,2,FALSE)),
=CONCATENATE(01 21 00,' - ',VLOOKUP(01 21 00,C:D,2,FALSE)),
=CONCATENATE(01 22 00,' - ',VLOOKUP(01 22 00,C:D,2,FALSE)),
=CONCATENATE(02 41 16,' - ',VLOOKUP(02 41 16,C:D,2,FALSE)),
=CONCATENATE(02 41 19,' - ',VLOOKUP(02 41 19,C:D,2,FALSE))]
您必须编写一个 javascript 等效于 vlookup 函数的函数。 lookupArray.indexOf(valueArray[k]) 将为您提供您要查找的值的索引。
CONCATENATE()
和 VLOOKUP()
是可以分配给单元格的函数,不能分配给数组或变量。
您的问题有两种解决方案:
- 将公式
VLOOKUP()
应用于工作表中的虚拟单元格,然后读取计算值或
- 将列 C 的值分配给数组并使用 JavaScript 函数
indexOf
获取 miniArray[k]
的索引并将此索引用作行号以检索D列中的相应值
在这两种情况下,都可以在 Apps 脚本中连接字符串,只需将它们添加为 +
Solution 1
for(var k=0; k<miniArray.length; k++){
spreadsheet.getSheetByName("Specification Matrix").getRange('A10').setValue('=VLOOKUP("' + miniArray[k] + '",C:D,2,FALSE)');
var value=spreadsheet.getSheetByName("Specification Matrix").getRange('A10').getValue();
var pushItem = miniArray[k] + ","+value;
...
}
Solution 2
for(var k=0; k<miniArray.length; k++){
// the code would be more efficient if you use the syntax getRange(row, column, numRows, numColumns) instead of taking the whole column C
var myRangeValues=spreadsheet.getSheetByName("Specification Matrix").getRange('C1:C').getValues();
var auxArray=[];
var value;
for(var x=0;x<myRangeValues.length;x++){
auxArray.push(myRangeValues[x][0]);
}
var IndexNumber=auxArray.indexOf(miniArray[k]);
if(IndexNumber!=-1){
value=spreadsheet.getSheetByName("Specification Matrix").getRange('D1:D').getValues()[IndexNumber][0];
var pushItem = miniArray[k] + ","+value;
}
...
}
我正在尝试 create/modify 基于 CONCATENATE 和 VLOOKUP 公式的数组元素。执行代码时,显示的是公式而不是结果。
目标是获取规范矩阵 sheet 的一部分中的信息,执行 VLOOKUP,并将原始值与相同 sheet 的 C 列中的信息连接起来短跑。如果使用公式,则以下公式有效:=CONCATENATE(P107," - ",VLOOKUP(P107,C:D,2,FALSE))
连接的值将分布在(最多)97 sheets 内sheet,我想自动执行此任务。在脚本中,P107
的公式值被替换为 miniArray[k]
function specToTab() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var specMatrix = spreadsheet.getSheetByName("Specification Matrix");
specMatrix.activate();
var specMatrixArray = spreadsheet.getRangeByName('specMatrixFull').getValues();
//Delete rows that have no specifications and sheets 10A, 11A, 12A
var newArray = specMatrixArray.filter(function(item){return item[1] != "" && item[0] != "10A" && item[0] != "11A" && item[0] != "12A";});
//Iterate through the applicable trades and break apart the arrays
for(var j=0; j<newArray.length;j++){
var miniArray = newArray[j];
//miniSheet is the current trade
var miniSheet = miniArray[0];
for(var i=0; i< miniArray.length; i++){
if(miniArray[i] == ''){
miniArray.splice(i);
}
}
// Delete the trade from the specification array
miniArray.splice(0,1);
// create new array for the concatenate formula
// THIS IS WHERE THE CODE IS NOT WORKING!!!
var pushArray = []
for(var k=0; k<miniArray.length; k++){
var pushItem = "=CONCATENATE(" + miniArray[k] + ",' - ',VLOOKUP(" + miniArray[k] + ",C:D,2,FALSE))";
pushArray.push(pushItem);
}
Logger.log(miniSheet);
Logger.log(miniArray);
Logger.log(pushArray);
}
}
所需的 miniSheet 和 miniArray 输出正确发布。问题是公式不是针对 pushArray 计算的。预期输出是
[Division 00 -
00 40 21 - Prevailing Wage Rates
Division 01 - GENERAL REQUIREMENTS
01 10 00 - Summary
01 21 00 - Allowances
01 22 00 - Unit Prices
02 41 16 - Structure Demolition
02 41 19 - Selective Structure Demolition]
实际输出为:
[=CONCATENATE(Division 00,' - ',VLOOKUP(Division 00,C:D,2,FALSE)),
=CONCATENATE(00 40 21,' - ',VLOOKUP(00 40 21,C:D,2,FALSE)),
=CONCATENATE(Division 01,' - ',VLOOKUP(Division 01,C:D,2,FALSE)),
=CONCATENATE(01 10 00,' - ',VLOOKUP(01 10 00,C:D,2,FALSE)),
=CONCATENATE(01 21 00,' - ',VLOOKUP(01 21 00,C:D,2,FALSE)),
=CONCATENATE(01 22 00,' - ',VLOOKUP(01 22 00,C:D,2,FALSE)),
=CONCATENATE(02 41 16,' - ',VLOOKUP(02 41 16,C:D,2,FALSE)),
=CONCATENATE(02 41 19,' - ',VLOOKUP(02 41 19,C:D,2,FALSE))]
您必须编写一个 javascript 等效于 vlookup 函数的函数。 lookupArray.indexOf(valueArray[k]) 将为您提供您要查找的值的索引。
CONCATENATE()
和 VLOOKUP()
是可以分配给单元格的函数,不能分配给数组或变量。
您的问题有两种解决方案:
- 将公式
VLOOKUP()
应用于工作表中的虚拟单元格,然后读取计算值或 - 将列 C 的值分配给数组并使用 JavaScript 函数
indexOf
获取miniArray[k]
的索引并将此索引用作行号以检索D列中的相应值 在这两种情况下,都可以在 Apps 脚本中连接字符串,只需将它们添加为+
Solution 1
for(var k=0; k<miniArray.length; k++){
spreadsheet.getSheetByName("Specification Matrix").getRange('A10').setValue('=VLOOKUP("' + miniArray[k] + '",C:D,2,FALSE)');
var value=spreadsheet.getSheetByName("Specification Matrix").getRange('A10').getValue();
var pushItem = miniArray[k] + ","+value;
...
}
Solution 2
for(var k=0; k<miniArray.length; k++){
// the code would be more efficient if you use the syntax getRange(row, column, numRows, numColumns) instead of taking the whole column C
var myRangeValues=spreadsheet.getSheetByName("Specification Matrix").getRange('C1:C').getValues();
var auxArray=[];
var value;
for(var x=0;x<myRangeValues.length;x++){
auxArray.push(myRangeValues[x][0]);
}
var IndexNumber=auxArray.indexOf(miniArray[k]);
if(IndexNumber!=-1){
value=spreadsheet.getSheetByName("Specification Matrix").getRange('D1:D').getValues()[IndexNumber][0];
var pushItem = miniArray[k] + ","+value;
}
...
}