【问题标题】:Find Duplicates and Set Value to True查找重复项并将值设置为 True
【发布时间】:2015-07-27 19:58:03
【问题描述】:

我有一个脚本,它仅将其中一个匹配行的值设置为 True。同一个电子表格中有两张工作表。我让脚本检查一张与另一张的匹配值。问题是它只将 True 放在最后一个匹配值旁边,而不是所有不同的匹配值。我如何让它找到所有可能的重复项并将 True 放在每个重复项旁边。它正在寻找的值实际上是注册码;如果有人取消注册,他们输入他们的注册码,它将与他们在注册表中的注册行匹配。

function findDuplicates() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetR = ss.getSheetByName("Registration");
  var sheetCR = ss.getSheetByName("Cancel Registration")
  var dataR = sheetR.getDataRange().getValues();
  var dataCR = sheetCR.getDataRange().getValues();
  var newData = new Array();
  var headerRow = 1;
  for (var i = 1; i < dataR.length && i < dataCR.length; ++i) {
      var rowR = dataR[i];
      var rowCR = dataCR[i];
      var duplicate = false;
          if (rowR[9] === rowCR[8]) {
              duplicate = true;
          }
  }
  if (duplicate = true) {
      sheetR.getRange(headerRow + i, 11).setValue("True");
  }
}

更新代码:

function findDuplicates() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetR = ss.getSheetByName("Registration");
  var sheetCR = ss.getSheetByName("Cancel Registration")
  var dataR = sheetR.getDataRange().getValues();
  var dataCR = sheetCR.getDataRange().getValues();
  var headerRow = 1;
  for (var i = 1; i < dataR.length && i < dataCR.length; i++) {
      var rowR = dataR[i];
      var rowCR = dataCR[i];
      var duplicate = false;
          if (rowR[9] === rowCR[8]) {
              duplicate = true;
          }
          if (duplicate === true) {
              sheetR.getRange(headerRow + i, 11).setValue("True");
          }
  }
}

更新:

function findDuplicates() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetR = ss.getSheetByName("Registration");
  var sheetCR = ss.getSheetByName("Cancel Registration")
  var dataR = sheetR.getDataRange().getValues();
  var dataCR = sheetCR.getDataRange().getValues();
  var headerRow = 1;
  for (var i = 1; i < dataR.length; i++) {
      for (var j = 1; j < dataCR.length; j++) {
          var rowR = dataR[i];
          var rowCR = dataCR[j];
          var duplicate = false;
              if (rowR[9] === rowCR[8]) {
                  duplicate = true;
              }
              if (duplicate === true) {
                  sheetR.getRange(headerRow + i, 11).setValue("Y");
              }
    }
  }
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    您的 if (duplicate = true) 在 for 循环之外。由于它根据i 的值计算行,因此它只更改i 的最后一个值的值,这是在工作表中找到的最后一个重复元素。所以,我建议你把它移到 for 循环中。

    使用上述更改测试了代码,一切正常。此外,您的代码当前运行超过限制 11 行。也就是说,如果您的第 12 行是有数据的最后一行并且第 13 行是空的,那么它也将第 13 行中的列的值设置为TRUE。在 for 循环中将 ++i 更改为 i++ 也可以解决此问题。

    最后但并非最不重要的一点是,您的 if 语句声明必须是 duplicate == true 而不是 duplicate = true 因为第一个是检查重复值是否为真,第二个实际上是分配值重复是真的。

    【讨论】:

    • 感谢您的帮助。我将 ++1 更改为 1++,将 if 语句放在 for 循环中(之前尝试过,从未工作过)并将重复 = true 更改为重复 == true。没啥事儿。我就这样离开了,但是将重复的 == true 改回了一个 =,它在取消注册表的行位置放置了三个 Y,第 1、2、3 行。应该只有两个 Y,因为只有两个匹配登记表中的登记。在登记表中,它们位于第 3 行和第 5 行。
    • 由于某种原因,我的 if 语句不一样(第一个带有 rowR[9]...)第一个重复点,而不是第二个大声笑。
    • 嗯...奇怪..因为我测试了代码并且它在我的末端完美运行。使用 Logger.log 语句确保您引用了正确的单元格。另外,您可以在此处使用您的更改更新代码吗?
    • 它有效。确保您在声明 if (rowR[9] === rowCR[8]) 中引用的单元格是正确的。请记住,您的值存储在一个数组中,因此如果您要比较第 9 列和第 8 列中的值,它实际上分别是 rowR[8] 和 rowCR[7]。
    • 是的,他们是正确的。它实际上是 J 列和 I 列,因此是 10 和 9。我不确定它是否有所不同,但它比较的值是唯一代码。有人注册,然后在表单中注册旁边的 J 列中创建一个唯一代码。如果/当同一个人取消他们的注册时,它会将包括注册码在内的所有相同信息放在取消注册表中。因此,下一个副本与第一个副本的代码不同。 A 人注册然后取消,然后 B 人注册然后取消。它只是标记第一个重复的 reg 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2018-11-25
    相关资源
    最近更新 更多