下面的函数在第二次和第三次通过'for循环'时返回空值,我无法弄清楚原因。包含'i = start'的for循环循环遍历'decisionPoints'变量并根据第一列中的值返回数据。 'decisionPoints'中的前几行在第一列中有'1'。接下来的几行在第一列中有'2',接下来的几行有'3'。当循环搜索“2”和“3”时,它会在包含它正在查找的第一个值的行之前为每一行返回空值。因此,当它搜索“2”时,我看到包含“1”的前面行的三个空值。当它搜索“3”时,我看到包含“1”或“2”的前面行的六个空值。
任何人都可以探究为什么吗?
var loBuild = function(loNumber,category){
var lo = [],
spreadsheet = SpreadsheetApp.getActiveSpreadsheet(),
decisionPointsSheet = spreadsheet.getSheetByName("Decision Points"),
lastColumn = decisionPointsSheet.getLastColumn(),
lastDecisionPoint = decisionPointsSheet.getLastRow(),
decisionPoints = decisionPointsSheet.getRange(1,1,lastDecisionPoint,lastColumn).getValues(),
count = 0,
loColumn = [];
decisionPoints.shift();
for(i in decisionPoints){
loColumn.push(decisionPoints[i][0]);
if(decisionPoints[i][0] === loNumber){
count++;
}
}
var start = loColumn.indexOf(loNumber);
for(i = start; i < count+start; i++){
lo[i] = [];
var dp = decisionPoints[i][1];
var dpLabel = decisionPoints[i][3];
for(j = 0; j < lastColumn; j++){
switch(j){
case 0:
lo[i][j] = dp;
break;
case 1:
lo[i][j] = "=countifs('" + dpLabel + "'!F:F,\"" + category + "\")"
break;
case 2:
lo[i][j] = "=countifs('" + dpLabel + "'!F:F,\"FCC\")"
break;
}
}
}
return(lo);
}
答案 0 :(得分:1)
for(i = start; i < count+start; i++){
lo[i] = [];
如果start=3
,则开始从第4个元素(lo [3])填充lo
数组 - 因此lo [0],lo [1]和lo [2]将自动添加前置使用空值进入数组,因为数组是从0开始的。
看起来您正在尝试创建工作表行值数组来替换/更新现有工作表行?在这种情况下,最好使lo
包含行索引引用和新值数组的对象数组:
重要说明:以下代码假定工作表中的数据按第一列(loNumber值)排序。此假设基于您发布的代码示例,特别是您如何设置count
变量(如果工作表未按loNumber列排序,则代码将循环错误的行)。
lo = [];
...
var start = loColumn.indexOf(loNumber);
for(i = start; i < count+start; i++){
var objRow = {rowIndex: i, rowValues: []}; // row object
var dp = decisionPoints[i][1];
var dpLabel = decisionPoints[i][3];
for(j = 0; j < lastColumn; j++){
switch(j){
case 0:
objRow.rowValues[j] = dp;
break;
case 1:
objRow.rowValues[j] = "=countifs('" + dpLabel + "'!F:F,\"" + category + "\")"
break;
case 2:
objRow.rowValues[j] = "=countifs('" + dpLabel + "'!F:F,\"FCC\")"
break;
default:
objRow.rowValues[j] = ""; // if j is > 2
}
}
lo.push(objRow); // push row object into lo array
}
return(lo);
E.g。假设start=3
和count=2
,您将获得此lo
数组:
[
{rowIndex:3, rowValues:[row3_col0_value, row3_col1_formula, row3_col2_formula]},
{rowIndex:4, rowValues:[row4_col0_value, row4_col1_formula, row4_col2_formula]}
]
然后,您可以在相应的表格行中循环遍历lo
数组和setValues():
for ( var i=0; i<lo.length; i++ ) {
var rowData = lo[i];
sheet
.getRange( rowData.rowIndex-1, 1, 1, rowData.rowValues.length )
.setValues( [rowData.rowValues] );
}