使用公式修改应用程序脚本数组项

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;
      }
   ...
   }