有没有办法检测 google 工作表和 运行 函数中的点击?

Is there a way to detect clicks in google sheets and run a function?

我有一个 Google Spreadsheet,如下所示。

最下面的30就是标题显示的点数。我如何做到这一点,以便当用户单击购买按钮时,它会从底部的 30 中减去它旁边的点数(忽略文本),并在 30 下方添加一行,上面写着刚刚购买的商品已购买?

EX:用户单击项目 1 上的“购买”按钮。代码仅从前一个单元格中获取数字,并从 sheet 底部的 30 中减去它,然后在下面创建一个新行单元格是 30,新行的第一个单元格显示“项目” 参考图片:

如果有人能帮我解决这个问题,那就太好了……谢谢! 更新:我现在可以使用了,但是我怎样才能做到不删除以前的购买,而是将其添加到未使用的行中? 这是到目前为止的代码:

function onSelectionChange(e) {
 const sheet = SpreadsheetApp.getActiveSheet();
  const resultA1Notation = "A21"; // Change according to your preferences
  const itemNotation = "A22"; // Change according to your preferences
  const range = e.range;
  const selectedValue = range.getValue();
  if (selectedValue === "Buy") {
    let numberValue = range.offset(0, -1).getValue();
    const itemValue = range.offset(0, -4).getValue();
    if (numberValue !== "Free") {
      numberValue = numberValue.slice(0, -1); // Remove P
      const resultCell = sheet.getRange(resultA1Notation);
      resultCell.setValue(resultCell.getValue() - numberValue);
    }
    sheet.getRange(itemNotation).setValue(itemValue + " was purchased!");
  }
}

谢谢!

您可以使用一个简单的 onSelectionChange(e) 触发器,每当用户在电子表格中选择不同的 cell/range 时,它就会触发您的函数。您可以执行以下操作:

  • 检查选择的值是否为Buy
  • 如果是这种情况,请使用 Range.offset(rowOffset, columnOffset).
  • 检索其左侧的数字值及其旁边的项目名称
  • 检查值是否为 Free。如果不是这种情况,则假定它是一个数字和字母 P。使用 slice and update the result cell at the bottom using getValue and setValue.
  • 删除最后一个字符
  • 更新结果编号下方的单元格,说明已购买的商品,再次使用 setValue

代码片段:

function onSelectionChange(e) {
  const sheet = SpreadsheetApp.getActiveSheet();
  const resultA1Notation = "A11"; // Change according to your preferences
  const itemNotation = "A12"; // Change according to your preferences
  const range = e.range;
  const selectedValue = range.getValue();
  if (selectedValue === "Buy") {
    let numberValue = range.offset(0, -1).getValue();
    const itemValue = range.offset(0, -2).getValue();
    if (numberValue !== "Free") {
      numberValue = numberValue.slice(0, -1); // Remove P
      const resultCell = sheet.getRange(resultA1Notation);
      resultCell.setValue(resultCell.getValue() - numberValue);
    }
    sheet.getRange(itemNotation).setValue(itemValue + " was purchased!");
  }
}

注:

  • 我假设底部的结果和显示已购买商品的消息位于单元格 A11A12 中。如果不是这种情况,请更改代码片段中的这些符号。
  • Event object for onSelectionChange is currently not documented, but its properties can be known through some little testing (see 显示所有对象属性)。具体来说,range 是该对象的一个​​ 属性,上面的代码片段使用了它。