1

私はかなり長い間探していたので、他の誰もこれを尋ねていないことを願っています.

私は 2 つのシートを持つ Google スプレッドシートを持っています。1 つはフォーム送信を含む一種のデータベースで、もう 1 つはユーザーが一度に 1 つずつ送信を操作する方法です。

基本的に、ユーザーが提出物に変更を加えて、元のシートと同じ行に保存できるようにしたいと考えています。

変更を送り返すコードはありますが、正しい行の座標を取得する方法がわかりません:

function saveChanges() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var source = ss.getSheets()[0];
 var destination = ss.getSheets()[1];

 var range = source.getRange("A40:BL40");

  // Find coordinates of the row where value of cell A40 matches a cell in A:A in second spreadsheet

 // This copies the data in A40:BL40 in the source sheet to
 // D4:F6 in the second sheet
 range.copyValuesToRange(destination, 1, 64, 16, 16);
}

現時点では、データは現在空の行を指している座標「1、64、16、16」に書き込まれているだけです。理想的には、それを正しい座標の変数に変更します。

セル A40 の値は一意の ID であり、2 番目のシートを検索するのに理想的ですが、方法がわかりません。

私はJavascriptに非常に慣れていないので、どんな助けでも大歓迎です。

4

1 に答える 1

1

フォームの回答シートで一致する値を見つけるには、範囲をループして一致を見つける必要があります。方法はいくつかありますが、いくつか紹介します。

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 / -10 ベースの配列を 1 ベースの行と列に揃えるために必要な精神的な体操を避けることができます。

于 2013-06-19T19:22:28.450 に答える