我用表制作了文件。在那些表上,有一些数据根据每个文件而变化。所以我创建了一个文件,其中有一个表格,其中汇总了其他文件中的所有其他表格。首先,我编写了将两个文件的表相加的代码:
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 但我不知道为什么......
Range.getCell()接受两个参数:行偏移量和列偏移量。你只给它一个参数:三个数字的数组。
Range.getCell()
你不应该首先使用Range.getCell()。相反,使用Array.map()获取工作表,使用Array.forEach()对其进行迭代,最后Range.setValues()在一个操作中写入所有结果,如下所示:
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); }