一尘不染

如何修复错误:TypeError:无法正确读取未定义的谷歌应用脚​​本的“setValues”。如何在我的代码中实现它?

javascript

我用表制作了文件。在那些表上,有一些数据根据每个文件而变化。所以我创建了一个文件,其中有一个表格,其中汇总了其他文件中的所有其他表格。首先,我编写了将两个文件的表相加的代码:

function juneFunction() {
  var sheet_origin1=SpreadsheetApp
                      .openById("ID1")
                      .getSheetByName("Calcul/Machine");
  var sheet_origin2=SpreadsheetApp
                      .openById("ID2")
                      .getSheetByName("Calcul/Machine"); 
  var sheet_destination=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  //define range as a string in A1 notation
  var range1="BU4:CF71"  
  var values1=sheet_origin1.getRange(range1).getValues();
  var values2=sheet_origin2.getRange(range1).getValues(); 
  var destinationrange=sheet_destination.getRange("C3:N70");
  //Here you sum the values of equivalent cells from different sheets
  for(var i=0; i<values1.length;i++)
  {
    for(var j=0; j<values1[0].length;j++)
    {
      sum=values1[i][j]+values2[i][j];
      destinationrange.getCell(i+1,j+1).setValue(sum);
    }
  } 
}

这段代码运行良好。但我的目标是总结 26 个文件的 26 个表。所以我试着用 3 个文件来做,这里是代码:

function juneFunction() {

  var sheet_origin1=SpreadsheetApp
                      .openById("ID1")
                      .getSheetByName("Calcul/Machine");
  var sheet_origin2=SpreadsheetApp
                      .openById("ID2")
                      .getSheetByName("Calcul/Machine");
  var sheet_origin3=SpreadsheetApp
                      .openById("ID3")
                      .getSheetByName("Calcul/Machine");
  var sheet_destination=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();


  //define range as a string in A1 notation
  var range1="BU4:CF71"  

  var values1=sheet_origin1.getRange(range1).getValues();
  var values2=sheet_origin2.getRange(range1).getValues();
  var values3=sheet_origin3.getRange(range1).getValues();

  var destinationrange=sheet_destination.getRange("C3:N70");

  //Here you sum the values of equivalent cells from different sheets
  for(var i=0; i<values1.length;i++)
  {
    for(var j=0; j<values1[0].length;j++)
    {
      for(var k=0; k<values1[0].length;k++){
        sum=values1[i][j][k]+values2[i][j][k]+values3[i][j][k];
        destinationrange.getCell[[i+1,j+1,k+1]].setValues(sum);
      }
    }
  }
}

这里我有这个错误:TypeError:无法正确读取未定义的“setValues”。这个错误发生在这里:

destinationrange.getCell[[i+1,j+1,k+1]].setValues(sum);

我认为错误来自 .getCell 但我不知道为什么......


阅读 82

收藏
2022-07-25

共1个答案

一尘不染

Range.getCell()接受两个参数:行偏移量和列偏移量。你只给它一个参数:三个数字的数组。

你不应该首先使用Range.getCell()。相反,使用Array.map()获取工作表,使用Array.forEach()对其进行迭代,最后Range.setValues()在一个操作中写入所有结果,如下所示:

function sumRangeAcrossManySpreadsheets() {
  const spreadSheetIds = ['id1', 'id2', 'id3',];
  const sheetName = 'Calcul/Machine';
  const rangeA1 = 'BU4:CF71';
  const targetRange = SpreadsheetApp.getActiveSheet().getRange('C3');
  const sheets = spreadSheetIds.map(id => SpreadsheetApp.openById(id).getSheetByName(sheetName));
  const result = [];
  sheets.forEach((sheet, sheetIndex) => {
    if (!sheet) {
      throw new Error(`There is no sheet ${sheetName} in spreadsheet ID '${spreadSheetIds[sheetIndex]}'.`);
    }
    const values = sheet.getRange(rangeA1).getValues();
    values.forEach((row, rowIndex) => row.forEach((value, columnIndex) => {
      if (!result[rowIndex]) {
        result[rowIndex] = new Array(row.length).fill(0);
      }
      result[rowIndex][columnIndex] += Number(value) || 0;
    }));
  });
  targetRange.offset(0, 0, result.length, result[0].length).setValues(result);
}
2022-07-25