要在表单响应表中查找匹配值,您必须遍历范围以查找匹配项。有很多方法可以做到这一点,我将展示几个。
这是您的函数的一个版本saveChanges()
,它将从您的目标工作表中获取所有数据,查看它的 A 列以匹配 中的值A40
,然后更新该行中的数据。
function saveChanges() {
var uniqueIdColIndex = 0; // Col "A" has unique ID, is element 0 in row array
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source = ss.getSheets()[0];
var destination = ss.getSheets()[1];
var sourceData = source.getRange("A40:BL40").getValues();
var destData = destination.getDataRange().getValues();
// Find coordinates of the row where value of cell A40 matches a cell in A:A in second spreadsheet
for (var rowIndex=0; rowIndex < destData.length; rowIndex++) {
if (sourceData[0][uniqueIdColIndex] == destData[rowIndex][uniqueIdColIndex]) {
// Found our match
destination.getRange(rowIndex+1,1,sourceData.length,sourceData[0].length)
.setValues(sourceData);
break; // Done, exit loop
}
}
}
这是另一种方法。.getValues()
这一次,我们没有读取目标工作表中的所有数据,只读取 A 列中的信息。为了能够利用数组查找方法,需要先转置via 检索到的二维数组- 所以我们使用一个辅助函数来做到这一点。(我正在使用这个答案transpose()
中的功能。)
function saveChanges() {
var uniqueIdColIndex = 0; // Col "A" has unique ID, is element 0 in row array
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source = ss.getSheets()[0];
var destination = ss.getSheets()[1];
var sourceData = source.getRange("A40:BL40").getValues();
// Get column A from destination sheet
var destDataTrans = transpose(destination.getRange(1, 1, destination.getLastRow(),1).getValues());
// Find coordinates of the row where value of cell A40 matches a cell in A:A in second spreadsheet
var destRow = destDataTrans[0].indexOf(sourceData[0]) + 1; // +1 to adjust to spreadsheet rows
if (destRow > 0) {
// Found our match
destination.getRange(destRow,1,sourceData.length,sourceData[0].length)
.setValues(sourceData);
}
}
第二种方法的代码行数更少,但应该比第一种方法慢一些,因为该transpose()
函数在执行搜索之前会触及 A 列中的每个元素.indexOf()
。(第一种方法在原地搜索,一旦找到匹配就退出,所以它实际上做的工作更少。)
在这两个例子中,我都尽量限制对谷歌服务的调用。或者,您可以从搜索循环内的电子表格中读取信息,这会慢得多,但可以避免+1 / -1
保持基于 0 的数组与基于 1 的行和列对齐所需的心理体操。