1

我一直在寻找很长一段时间,所以希望没有其他人问过这个问题。

我有一个带有两张表格的 Google 电子表格,一张是包含表单提交的数据库,另一张是用户一次与提交进行交互的一种方式。

基本上我希望用户能够对提交进行更改并将它们保存回原始工作表中的同一行。

我有将更改发回的代码,但我不知道如何获取正确行的坐标:

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,非常适合搜索第二张工作表,但我不知道如何。

我对 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
    }
  }
}

这是另一种方法。.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 的行和列对齐所需的心理体操。

于 2013-06-19T19:22:28.450 回答