如何使用onEdit将数据复制到另一个google sheet文件中,如果ID相同则覆盖数据?

How to use onEdit to copy the data to another google sheet file and overwrite the data if the ID is the same?

大家好,

我想将数据从源 sheet 复制到目标 sheet。当数据到达目标 sheet 时,脚本能够循环遍历目标 sheet 中的第 2 行以查看是否已存在任何相同的 ID。如果ID已经存在于第2行,那么它将覆盖该列中的数据,如果不存在,脚本将根据第2行找到最后一个空列并将数据粘贴到那里。

所以在上面的屏幕截图中,由于目标 sheet 中没有 1004,因此它会将数据粘贴到 E 列中。

这是我的代码:

function onEdit(e){
  var ss = SpreadsheetApp.getActiveSheet ();
  var targetfile = SpreadsheetApp.openById("11tpC8SNZ5XB35n7GON0St3ZQ37dIbM8UbXRjmkVAeJQ");
  var target_sheet = targetfile.getSheetByName("Sheet1");
  var target_range = target_sheet.getRange(3, ss.getLastColumn() + 1);
  
  if (e.range.columnStart == 3 && e.range.rowStart == 16){
    if (e.value == 'Submit'){
      var source_range = ss.getRange("C4:C14")
      source_range.copyTo(target_range);
      e.range.clearContent()
    } 
  } 
}

我目前的问题是:

这是我的 google 文件

来源sheet:https://docs.google.com/spreadsheets/d/12kKQKT2XSdPkJ46LSV9OiI167NKBdwKkpkOtOf_r_jI/edit#gid=0

目的地sheet: https://docs.google.com/spreadsheets/d/11tpC8SNZ5XB35n7GON0St3ZQ37dIbM8UbXRjmkVAeJQ/edit#gid=0

希望得到高手的指点和帮助。任何帮助将不胜感激!

解释:

我发现现有脚本存在一些问题:

  1. 简单触发器仅对容器 Spreadsheet 具有权限,因此要访问另一个 Spreadsheet,您需要创建一个 Installable Trigger:
// Creates an edit trigger for a spreadsheet identified by ID.
function createTrigger() {
  ScriptApp.newTrigger('copyFunction')
    .forSpreadsheet('source-sheet-id')
    .onEdit()
    .create();
}
  1. copyTo() 仅在复制到相同的 Spreadsheet 时有效。您需要使用 getValues()setValues() 来跨电子表格进行复制。需要注意的是格式不会被复制。如果填充了新列,则需要手动设置列格式。
function copyFunction(e) {
  var ss = SpreadsheetApp.getActiveSheet();
  var targetfile = SpreadsheetApp.openById('dest-sheet-id');
  var target_sheet = targetfile.getSheetByName("Sheet1");
  var id_table = target_sheet.getRange(2,2,1,target_sheet.getLastColumn()-1).getValues();
  
  if (e.range.getA1Notation() == 'C16') {
    if (e.value == 'Submit') {
      var source_values = ss.getRange("C3:C14").getValues();
      for (i = 0; i < id_table[0][i]; i++) {
        if (id_table[0][i] == ss.getRange("C3").getValue()) 
        break;
      }
      target_sheet.getRange(2,i+2,12).setValues(source_values);
      e.range.clearContent();
    } 
  } 
}