首页 > 解决方案 > 如何根据条件正确更新单元格?

问题描述

我在尝试使我的脚本正常工作时遇到了麻烦,我想知道是否有人可以帮助我解决这个问题。

我正在使用 Google 表格中的一个简单脚本,如果两行的 A、B、C、E 和 F 列相同,它将覆盖一行中的 D 列单元格。示例表的屏幕截图可以在这里看到。第 2 行是根据原始预留创建的,其中 AF 列由外部程序填充,G 和 H 列稍后由 Appsheet 填充。如果预订状态发生变化,外部程序将创建一个新行,其中包含更新的预订状态列 AF。我的想法是有一个脚本,如果它在数据中发现另一行具有相同的司机姓名、汽车、事件、日期和持续时间,它将替换原始预订 D 列中的一个单元格。

我试图将我的脚本基于重复删除脚本,但作为输出,它会删除“更新”行而不替换原始的 D 单元格。任何帮助将不胜感激!

//overwrite old rows with updated rows
function update() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newData = new Array();
  for(i in data){
    var row = data[i];
    var update = false;
    for(j in newData){

      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() ){
        update = true;
      }
    }
    if(!update){
      newData.push(row);
    }
  }


  // Clear the existing info and update with newData.
  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

标签: google-apps-scriptgoogle-sheets

解决方案


假如说:

  • 您想比较不同行中的 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
  }
}

您可以检查内联注释以逐步了解代码在做什么。

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

我希望这有任何帮助。


推荐阅读