【问题标题】:Google Sheets - Google Apps Script - ElseIf StatementGoogle 表格 - Google Apps 脚本 - ElseIf 语句
【发布时间】:2022-01-18 00:42:36
【问题描述】:

我正在尝试为 Google 表格创建一个函数,但对比较运算符和 elseif 格式感到困惑。

该函数指向工作表中的特定单元格,并根据状态值在工作表之间移动范围: Screenshot

我想做以下事情:

如果状态值 = "Pending" - 将范围移动到工作表 ORDERS |活跃

如果状态值 = "In Hand" - 将范围移动到工作表 ORDERS |完成

如果状态值 = "待售" - 将范围移动到工作表 SALES |活跃

如果状态值 = "Sold" - 将范围移动到工作表 SALES |完成

function onEdit(e) {
  const src = e.source.getActiveSheet();
  const r = e.range;
  if (r.columnStart != 2 || r.rowStart == 1 || e.value == ("In Hand"));
  const dest = e.source.getSheetByName('ORDERS | Complete');
  src.getRange(r.rowStart,1,1,12).moveTo(dest.getRange(dest.getLastRow()+1,1,1,12));
  src.deleteRow(r.rowStart);
}

谢谢

编辑 1

我对下面的答案有一些疑问(有效)。

  1. 这大大减慢了我的工作表 - 这肯定只在编辑指定范围时运行 - 还是在每次编辑工作表上的任何位置后运行(然后检查指定范围是否被编辑)?理想情况下,我希望它仅在列出的 4 个工作表上运行: 订单 |活跃,订单 |完成,销售 |活跃, 销售 |完成

  2. 使用 get column 和 get row 方法 - 这将确保函数在第 2 列中编辑的每一行上运行(这是我想要的) - 还是只在活动工作表上的第 2 列第 1 行上运行?

【问题讨论】:

  • 您想用r.columnStartr.rowStart 引用什么属性?我相信您想使用r.getColumn()r.getRow()
  • 你可能是对的,我在教程中发现了这个功能,我正在尝试调整它。我很高兴尝试使用 getColumn 来定位确切的值 - 它是工作表中的单元格 B2。
  • 这可能是问题的一部分。不过,您的代码布局似乎还有其他问题,因此我将发布一个答案来更全面地描述这些问题。
  • 这太棒了,谢谢!它运行良好。我希望这个函数稍微改变一下,所以我会创建一个新问题。再次感谢:)

标签: google-apps-script google-sheets


【解决方案1】:

您的(不完整的)代码似乎有一些问题可能是罪魁祸首:

  1. 您的 if 语句中的 || 运算符是 OR 运算符,我认为您不希望这样做。您可能希望使用 && (AND) 运算符,因为这意味着 if 语句的主体仅在起始行/列正确且单元格值正确时才会执行。
  2. 似乎您可能希望对r.getColumn() 使用== 运算符而不是!=,因为您只想检查单元格的值,前提是它是状态列(B 列,也就是第2 列) )。
  3. 您的 if 语句似乎实际上并没有做任何事情,因为它以分号结尾。在 JavaScript(和 Google Apps 脚本)中,分号结束语句,因此您的 if 语句将立即终止,而没有机会执行任何逻辑。我们可以通过将其他语句移动到一组花括号中来解决这个问题:
function onEdit(e) {
  const src = e.source.getActiveSheet();
  const r = e.range;
  if (r.columnStart != 2 && r.rowStart == 1 && e.value == ("In Hand")) {
    const dest = e.source.getSheetByName('ORDERS | Complete');
    src.getRange(r.rowStart,1,1,12).moveTo(dest.getRange(dest.getLastRow()+1,1,1,12));
    src.deleteRow(r.rowStart);
  }
}
  1. 我们可以在这里使用几个 if-else 语句来为每个可能的状态值实现逻辑,但这需要大量不必要的代码重复。 switch-case 似乎是解决此问题的更好方法:
function onEdit(e) {
  const src = e.source.getActiveSheet();
  const r = e.range;
  if (r.getColumn() == 2 && r.getRow() == 1 && r.getWidth() == 1 && r.getHeight() == 1) {
    var sheetName;
    switch (e.value) {
      case "Pending":
        sheetName = "ORDERS | Active";
        break;
      case "In Hand":
        sheetName = "ORDERS | Complete";
        break;
      case "For Sale":
        sheetName = "SALES | Active";
        break;
      case "Sold":
        sheetName = "SALES | Complete";
        break;
    }
    if (sheetName) {
      const dest = e.source.getSheetByName(sheetName);
      src.getRange(r.getRow(),1,1,12).moveTo(dest.getRange(dest.getLastRow()+1,1,1,12));
      src.deleteRow(r.getRow());
    }
  }
}

上面的 switch-case 将单元格值与有效状态进行比较,如果状态有效,则设置适当的工作表名称。然后,我们可以以任何我们想要的方式操作该表。

附带说明:我在 if 语句中添加了两个附加条件来检查范围大小是否为 1x1,因为如果范围大于单元格,e.value 将不可用。

编辑: 上面的代码块分别使用r.getColumn()r.getRow() 代替r.columnStartr.rowStart,因为这些方法被记录而属性没有记录,尽管它是一个偏好问题。

【讨论】:

  • 1. “正如在 cmets 中所讨论的那样。”请记住,帖子应该是自包含的,在这种情况下,更具体地说,请记住 cmets 可以随时删除,因此与帖子相关的任何内容都应包含在其中。
  • 2.在这种情况下,通过r.getColumn()r.getRow() 更改`r.columnStart` 和r.rowStart 并不能解决任何问题,它只是改变“样式”(如果建议不使用未记录的功能可能会很好,但是这个属性为google-apps-script 专家所熟知。
  • @Rubén 答案已编辑以解决第一点。感谢您的提醒。为了使用记录的方法,我将保留关于第二点的代码。
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多