【问题标题】:Apps Script: How to limit the scope of a FOR LOOP?Apps 脚本:如何限制 FOR LOOP 的范围?
【发布时间】:2021-12-19 12:58:11
【问题描述】:

只要E列(即数组[4])中的任何单元格被编辑,下面的脚本就会运行。它的唯一目的是向已编辑行的后续空单元格添加一些附加信息。但是,我的脚本不仅将这些信息添加到同一行中为空的下一个单元格,而是重新设置所有后续单元格的值,即使这些后续单元格中已经包含了一些值。有人可以告诉我我在这里做错了什么以及如何解决吗?很明显,我在 IF 语句 中做错了什么,但老实说我不知道​​那可能是什么:(

非常感谢您的帮助和提示!!!


这是脚本:

function addAdditionalInfo() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('SHEET_ID');
  var data = s.getDataRange().getValues();
  var data_len = data.length;
  for (var i = 0; i < data_len; i++) {
    if (data[i][4] == "COMPLETED") {
      s.getRange(i + 1, 6).setValue("name");
      s.getRange(i + 1, 7).setValue("street");
      s.getRange(i + 1, 8).setValue("street number");
      s.getRange(i + 1, 9).setValue("zip code");
      s.getRange(i + 1, 10).setValue("country");
      s.getRange(i + 1, 11).setValue("maternal language");
      s.getRange(i + 1, 12).setValue("second language");
      s.getRange(i + 1, 13).setValue("-");
    }
    else if (data[i][4] == "APPROVAL") {
      s.getRange(i + 1, 6).setValue("name of supervisor)");
      s.getRange(i + 1, 7).setValue("email of supervisor");
      s.getRange(i + 1, 8).setValue("tel of supervisor");
      s.getRange(i + 1, 9).setValue("maternal language of supervisor");
      s.getRange(i + 1, 10).setValue("second language of supervisor");
      s.getRange(i + 1, 11).setValue("assistant of the supervisor");
      s.getRange(i + 1, 12).setValue("status of the approval process");
      s.getRange(i + 1, 13).setValue("approval due date");
    }
  }
}

这里是触发器:

// The trigger is any manual change done in Column E, starting at row 3 of that column
function onEdit(e) {
  if (
    e.source.getSheetName() == "SHEET_ID" &&
    e.range.columnStart == 5 &&
    e.range.columnEnd == 5 &&
    e.range.rowStart >= 3 &&
    e.range.rowEnd <= 3000
  ) {
    addAdditionalInfo()
  }
}

【问题讨论】:

  • @Tanaike - 如果你在附近,能给我一些提示和/指向正确的方向吗?你对我有什么建议吗,@Cooper?那真是太好了。谢谢:)
  • 您认为e.range.rowStart 包含什么? e.range所指的范围是多少?
  • @TheMaster - e.range.rowStart 在 E 列中,包含与 E 列中所有其他单元格相同的下拉列表。 e.range.rowStart 也是同一列 E 中的第一个非空行。一旦用户在该列 E 中选择了一个选项,工作表中发生的任何更改都会开始。我是否完全回答了您的问题?谢谢:)
  • @TheMaster - e.range 指的是已编辑的单元格。你似乎暗示我根本不应该使用它?或者我在这里缺少什么?谢谢:)
  • 我的意思是你根本不需要循环。当您已经拥有需要检查的行和范围时,为什么要遍历每一行?

标签: javascript for-loop google-apps-script


【解决方案1】:

将数据添加到您所在的行将限制范围

尝试循环遍历整个工作表是个坏主意,因为此脚本将在 30 秒后达到最大值。

在我的测试中,我使用列表 COMPLETED,APPROVAL 在第 5 列中使用了验证

function onEdit(e) {
  e.source.toast('entry')
  const sh = e.range.getSheet();
  if (sh.getName() == 'Sheet0' && e.range.columnStart == 5 && e.range.rowStart > 2) {
    e.source.toast('completed');
    if (e.value == "COMPLETED") {
      sh.getRange(e.range.rowStart, 6, 1, 8).setValues([["name", "street", "street number", "zip code", "country", "maternal language", "second language", "-"]]);
    }
    if (e.value == "APPROVAL") {
      e.source.toast('approval')
      sh.getRange(e.range.rowStart, 6, 1, 8).setValues([["name of supervisor", "email of supervisor", "tel of supervisor", "maternal language of supervisor", "second language of supervisor", "assistant of the supervisor", "status of the approval process", "approval due date"]]);
    }
  }
}

工作表0:

【讨论】:

  • 我之前说过,需要再说一遍:你是个传奇人物——有一个大“L”!!!您的脚本不仅成功了,而且还让我看到了更多可能性,以提高我的 Apps 脚本编码技能。谢谢!谢谢!谢谢你!!!!尤其是需要更小心地使用循环。
猜你喜欢
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多