フォームの回答シートで一致する値を見つけるには、範囲をループして一致を見つける必要があります。方法はいくつかありますが、いくつか紹介します。
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
}
}
}
別の方法を次に示します。今回は、宛先シートのすべてのデータを読み取るのではなく、列 A の情報のみを読み取ります。配列ルックアップ メソッドを利用できるようにするには、取得した 2 次元配列を.getValues()
最初に転置する必要があります。それを行うためのヘルパー関数。(この回答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()
2 番目の方法はコード行数が少なくなりますが、最初の方法よりも少し遅くなるはず.indexOf()
です。(最初のアプローチはその場で検索し、一致が見つかると終了したため、実際にはあまり機能しません。)
どちらの例でも、Google のサービスへの呼び出しをできるだけ制限しようとしました。または、検索ループ内のスプレッドシートから情報を読み取ることもできます。これははるかに遅くなりますが、+1 / -1
0 ベースの配列を 1 ベースの行と列に揃えるために必要な精神的な体操を避けることができます。