如何使用另一个工作表中的新数据更新现有行?

时间:2019-10-04 16:41:14

标签: google-apps-script google-sheets

我有一个Google表格(example here),其中包含两个表格-表单和数据。我已经设置了表单,以便可以手动输入条目,然后单击“更新”按钮,数据将作为新行发送到数据表的底部,并且清除了“表单”字段,为下一个准备输入。

我正在尝试更进一步的步骤-如果单击“更新”按钮,并且“零件号”字段包含一个已经存在于数据表A列中的值(这意味着它已经在某个点输入了) ,则不应添加新行,但应使用新提交的数据来更新具有匹配部件号的现有行,而将所有未更改的字段保留为先前的值。

几年前,我已经在Excel中进行了设置并运行良好,但是Google表格完全是一个新的游戏,而且我找不到关于此功能如何与Google表格一起使用的有用信息。

以下代码非常适合添加新数据:

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();

}

如何更新此代码,以使在表单工作表中提交的所有现有零件号都更新数据表中的相应行,而不是将其作为新行输入?

1 个答案:

答案 0 :(得分:3)

看看是否可行

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()
}