在Google Apps脚本中返回空值

时间:2014-11-26 18:52:24

标签: javascript for-loop google-apps-script google-sheets

下面的函数在第二次和第三次通过'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);
    }

1 个答案:

答案 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=3count=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] );
}