Google apps script 如何根据条件正确更新单元格?

Google apps script 如何根据条件正确更新单元格?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我在试图让我的脚本工作时遇到了麻烦,不知道是否有人能帮我弄明白 我正在Google Sheets中编写一个简单的脚本,如果a、B、C、E和F列对两行都相同,它将覆盖一行中的D列单元格。可以看到示例表的屏幕截图。第2行基于原始保留,其中A-F列由外部程序填充,G和H列随后由Appsheet填充。如果保留状态更改,外部程序将创建一个新行,其中列a-F具有更新的保留状态。我的想法是创建一个脚本,如果它在数据中发现另一行具有相同的驾驶员姓名、车辆、事件、日期和持续时间,它将替换原始预订的D列中的一个单元

我在试图让我的脚本工作时遇到了麻烦,不知道是否有人能帮我弄明白

我正在Google Sheets中编写一个简单的脚本,如果a、B、C、E和F列对两行都相同,它将覆盖一行中的D列单元格。可以看到示例表的屏幕截图。第2行基于原始保留,其中A-F列由外部程序填充,G和H列随后由Appsheet填充。如果保留状态更改,外部程序将创建一个新行,其中列a-F具有更新的保留状态。我的想法是创建一个脚本,如果它在数据中发现另一行具有相同的驾驶员姓名、车辆、事件、日期和持续时间,它将替换原始预订的D列中的一个单元格

我尝试将我的脚本建立在重复删除脚本的基础上,但作为输出,它删除“更新”行,而不替换原始行中的D单元格。任何帮助都将不胜感激

//用更新的行覆盖旧行
函数更新(){
var sheet=SpreadsheetApp.getActiveSheet();
var data=sheet.getDataRange().getValues();
var newData=newarray();
对于(数据中的i){
var行=数据[i];
var更新=false;
对于(新数据中的j){
if(row.slice(0,2).join()==newData[j].slice(0,2).join()&&row.slice(4,5).join()==newData[j].slice(4,5.join()&&row.slice(3.join()!==newData[j].slice(3.join()){
更新=真;
}
}
如果(!更新){
newData.push(行);
}
}
//清除现有信息并使用新数据更新。
sheet.clearContents();
sheet.getRange(1,1,newData.length,newData[0].length).setValues(newData);
}
假设:

  • 您希望比较不同行中的A、B、C、E、F列
  • 如果所有这些值都匹配,而D中的值不匹配,则需要将D列的值从索引较高的行复制到索引较低的行,并删除索引较高的行
  • 在E列和F列中有日期和时间值
如果所有这些都正确,您可以尝试以下方法:

function update() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var rowsToDelete = []; // Array to store the rows to be deleted (this avoids the deletion of rows messing with the loop indexes)
  for (var i = 1; i < data.length; i++) {
    var firstRow = data[i];
    for (var j = i; j < data.length; j++) {
      var secondRow = data[j];
      if (i != j && firstRow[0] == secondRow[0] && firstRow[1] == secondRow[1] && firstRow[2] == secondRow[2] && firstRow[4].getTime() == secondRow[4].getTime() && firstRow[5].getTime() == secondRow[5].getTime() && firstRow[3].toLowerCase() != secondRow[3].toLowerCase()) {
        sheet.getRange(i + 1, 4).setValue(secondRow[3]); // Copying value D from higher to lower index
        rowsToDelete.push(j + 1); // New row to be removed
      }
    }
  }
  rowsToDelete.sort(function(a, b){return b - a}); // Sorting the rows to delete from higher to lower (to avoid messing with loop indexes)
  for (var r = 0; r < rowsToDelete.length; r++) {
    sheet.deleteRow(rowsToDelete[r]); // Deleting rows
  }
}
函数更新(){
var sheet=SpreadsheetApp.getActiveSheet();
var data=sheet.getDataRange().getValues();
var rowsToDelete=[];//用于存储要删除的行的数组(这避免了删除与循环索引相混淆的行)
对于(变量i=1;i
您可以一步一步地检查内联注释以了解代码在做什么

请注意,要比较E列和F列中的值,应使用or(否则这些条件将返回
false


我希望这能有所帮助。

谢谢您的意见!恐怕我没有正确地说明我的问题。在这个示例中,我使用了2行,而实际上,对于不同的顺序,我有大约100行。这意味着我需要脚本遍历整个数据集以查找与条件对应的现有行,而不是实际用D3替换D2,用D5替换D4等等。@EgorP我根据您的评论和问题版本更新了我的答案。请告诉我这是否适合你。