Google apps script 如何在谷歌电子表格中搜索并找到一行的坐标

Google apps script 如何在谷歌电子表格中搜索并找到一行的坐标,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我已经搜索了很长一段时间,希望没有其他人问过这个问题 我有一个谷歌电子表格,有两张表格,一张是一种包含表单提交的数据库,另一张是一种让用户一次一张地与提交进行交互的方式 基本上,我希望用户能够对提交内容进行更改,并将其保存回原始工作表中的同一行 我有代码将更改发送回,但我不知道如何获取正确行的坐标: function saveChanges() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var source = ss.getSheet

我已经搜索了很长一段时间,希望没有其他人问过这个问题

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

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

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

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非常陌生,因此非常感谢您提供的任何帮助。

要在表单响应表中找到匹配值,您必须在范围内循环查找匹配项。有很多方法可以做到这一点,我将展示一些

这是一个版本的
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
    }
  }
}
第二种方法的代码行较少,但应该比第一种方法慢一点,因为
transpose()
函数在执行
.indexOf()
搜索之前会接触列a中的每个元素。(第一种方法是就地搜索,一旦找到匹配项就退出,因此它实际上做的工作更少。)


在这两个例子中,我都尽量限制对谷歌服务的呼叫。或者,您可以从搜索循环中的电子表格中读取信息,这会慢得多,但可以避免将基于0的数组与基于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
    }
  }
}
第二种方法的代码行较少,但应该比第一种方法慢一点,因为
transpose()
函数在执行
.indexOf()
搜索之前会接触列a中的每个元素。(第一种方法是就地搜索,一旦找到匹配项就退出,因此它实际上做的工作更少。)

在这两个例子中,我都尽量限制对谷歌服务的呼叫。或者,您可以从搜索循环中的电子表格中读取信息,这会慢得多,但可以避免将基于0的数组与基于1的行和列对齐所需的
+1/-1
心理训练。

这太棒了(与我的想法类似,但我正试图从Python转换!),这两种方法都适用于少量的测试数据,但考虑到将来的使用,我选择了第二种方法。我们的用户将主要搜索列表底部的项目(添加了较新的项目),因此以后从下往上搜索可能会有用。再次感谢您,如果您来到英国伯恩茅斯,我会给您买一杯啤酒:)这太棒了(与我之前的想法类似,但我正试图从Python转换!),这两种方法都可以很好地处理少量的测试数据,但考虑到将来的使用,我选择了第二种方法。我们的用户将主要搜索列表底部的项目(添加了较新的项目),因此以后从下往上搜索可能会有用。再次感谢,如果你来英国伯恩茅斯,我会给你买瓶啤酒:)