Google apps script 如何使用其他工作表中的新数据更新现有行?

Google apps script 如何使用其他工作表中的新数据更新现有行?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个谷歌表单()和两张表单——表单和数据。我已经设置了表单表,以便可以手动输入条目,单击“更新”按钮后,数据将作为新行发送到数据表的底部,表单字段将被清除,为下一次输入做好准备 我试图更进一步—如果单击“更新”按钮,并且“零件号”字段包含数据表a列中已存在的值(意味着已在某个点输入),则不应添加新行,但具有匹配零件号的现有行应改为使用新提交的数据进行更新,将所有未更改的字段保留为其以前的值 几年前,我已经在Excel中设置好了这个功能,并且工作得很好,但是Google Sheets是一个全新

我有一个谷歌表单()和两张表单——表单和数据。我已经设置了表单表,以便可以手动输入条目,单击“更新”按钮后,数据将作为新行发送到数据表的底部,表单字段将被清除,为下一次输入做好准备

我试图更进一步—如果单击“更新”按钮,并且“零件号”字段包含数据表a列中已存在的值(意味着已在某个点输入),则不应添加新行,但具有匹配零件号的现有行应改为使用新提交的数据进行更新,将所有未更改的字段保留为其以前的值

几年前,我已经在Excel中设置好了这个功能,并且工作得很好,但是Google Sheets是一个全新的游戏,我一直无法找到任何关于如何使用Google Sheets的有用信息

以下是用于添加新数据的代码:

function submitData() {
  var ss        = SpreadsheetApp.getActiveSpreadsheet();
  var formSS    = ss.getSheetByName("Form");
  var datasheet = ss.getSheetByName("Data");

  var values = [[formSS.getRange("B2").getValue(),
                 formSS.getRange("B3").getValue(),
                 formSS.getRange("B4").getValue(),
                 formSS.getRange("B5").getValue()]];

  datasheet.getRange(datasheet.getLastRow()+1, 1, 1, 4).setValues(values);

  formSS.getRange("B2").clearContent(),
  formSS.getRange("B3").clearContent(),
  formSS.getRange("B4").clearContent(),
  formSS.getRange("B5").clearContent();

}
如何更新此代码,使表单中提交的任何现有零件号更新数据表上的相应行,而不是作为新行输入?

查看此操作是否有效

function submitData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formSS = ss.getSheetByName("Form");
var dataSheet = ss.getSheetByName("Data");

var values = formSS.getRange("B2:B5").getValues().reduce(function(a, b) {
    return a.concat(b)
});
var partNum = values[0];
var row;
dataSheet.getDataRange().getValues().forEach(function(r, i) {
    if (r[0] === partNum) {
        row = i + 1
    }
})
row = row ? row : dataSheet.getLastRow() + 1;
var data = dataSheet.getRange(row, 1, 1, 4).getValues()[0].map(function (el, ind){
  return el = values[ind] ? values[ind] : el;
  })
dataSheet.getRange(row, 1, 1, 4).setValues([data]);
formSS.getRange("B2:B5").clearContent()
}
看看这是否有效

function submitData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formSS = ss.getSheetByName("Form");
var dataSheet = ss.getSheetByName("Data");

var values = formSS.getRange("B2:B5").getValues().reduce(function(a, b) {
    return a.concat(b)
});
var partNum = values[0];
var row;
dataSheet.getDataRange().getValues().forEach(function(r, i) {
    if (r[0] === partNum) {
        row = i + 1
    }
})
row = row ? row : dataSheet.getLastRow() + 1;
var data = dataSheet.getRange(row, 1, 1, 4).getValues()[0].map(function (el, ind){
  return el = values[ind] ? values[ind] : el;
  })
dataSheet.getRange(row, 1, 1, 4).setValues([data]);
formSS.getRange("B2:B5").clearContent()
}

谢谢你-这很有效,除了替换行的所有数据,而不只是更新已更改的数据-是否有方法将未接收任何新数据的数据表单元格保留为其以前的值,而只更改接收新数据的单元格?我看不出会有什么区别?不需要更新的单元格不应清除。例如,如果我第一次输入零件号123并添加日期、材料批次和状态,然后单击“更新”,则所有这些信息将作为数据表上的新行添加。如果下次我需要更改状态,再次输入零件号123,然后输入状态并提交,现在数据表上的零件号和状态正确,但收到日期和材料批次为空,因为我没有再次添加它们的值,但我仍然需要该信息。谢谢-这很有效,除了替换行的所有数据,而不只是更新已更改的数据-是否有方法将未接收任何新数据的数据表单元格保留为其以前的值,而只更改接收新数据的单元格?我看不出会有什么区别?不需要更新的单元格不应清除。例如,如果我第一次输入零件号123并添加日期、材料批次和状态,然后单击“更新”,则所有这些信息将作为数据表上的新行添加。然后,如果我下次需要更改状态,再次输入零件号123,然后输入状态并提交,它现在会在数据表上用正确的零件号和状态更新,但收到的日期和材料批次为空,因为我没有再次添加它们的值,但我仍然需要该信息。