【问题标题】:Google spreadsheets script editor: onEdit setValue or clearContentGoogle 电子表格脚本编辑器:onEdit setValue 或 clearContent
【发布时间】:2020-03-22 23:40:17
【问题描述】:

我正在尝试制作一个电子表格来管理我的资金/费用,但在尝试自动化我的流程时遇到了问题

我想编写一段代码,每次在工作表中编辑单元格时运行。

触发时,我希望它计算 ssum、lsum 和 betal(在循环中),然后将其放入 3 个不同的单元格中。代码按预期运行,但 onedit 触发器不起作用。

这是我的代码:

function regnudbetalprocent() {

  var betal = 0;
  var i = 1;
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getActiveSheet();
  var sum = activeSheet.getRange(18, 5).getValue();
  var ssum;
  var lsum;
  var ssumori = activeSheet.getRange(3, 8).getValue();
  var lsumori = activeSheet.getRange(4, 8).getValue();
  var fuld = activeSheet.getRange(18, 2).getValue();

  while(betal < sum){

    ssum = ((ssumori - fuld / 2) / 100) * i;
    lsum = ((lsumori - fuld / 2) / 100) * i;
    betal = ssum + lsum;

    i++;
  }


    if (betal > sum) {
      var output = [
    [ssum,lsum],
    ["Samlet",betal]
  ]
       return output;
    }
}

输出变量从调用函数的位置相应地设置相邻单元格

我已尝试使用 setValue 和 clearContent,但我无法在调用函数的单元格之外进行编辑。我已经使用 Edit -> current project's triggers 添加了一个 onEdit 触发器,每次我编辑工作表时它都会增加,但没有任何反应.. 我筋疲力尽

有人可以指导我吗?我如何得到我想要的?

【问题讨论】:

  • 我无法理解I've tried with setValue and clearContent, but it i cant edit outside the cell from where the function is called.。我能问你在编辑单元格时要将结果值放在哪里吗?
  • @Tanaike 感谢您的回复。我想输入 3 个值,一个在 D21、E21 和 E22 中,如此屏幕截图所示gyazo.com/20b79f68eee379fa2d471860cf45f6b1
  • @Tanaike 这是我尝试在单元格上使用 setValue 时收到的消息“例外:您无权调用 setValue(第 7 行)。”
  • 感谢您的回复。根据您的回复,我提出了一个修改后的脚本作为答案。你能确认一下吗?如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

标签: javascript google-apps-script google-sheets


【解决方案1】:
  • 用于计算的值是“B18”、“E18”、“H3”和“H4”的常数单元格。
  • 您希望在编辑上述单元格之一时运行脚本。您想使用 OnEdit 事件触发器。
  • 您希望将结果值放入“D21”、“E21”和“E22”的单元格中。
  • 您的计算没有问题。

如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

修改点:

  • 在您的脚本中,我认为可以使用简单触发器代替可安装触发器。
  • 从您的回复中,关于"Exception: You do not have permission to call setValue (line 7).",我认为您可能正在使用regnudbetalprocent() 的函数作为自定义函数。在这种情况下,就会出现这样的错误。
  • 您可以使用事件对象知道编辑单元格的坐标。

当以上几点反映到你的脚本中时,它变成如下。

修改脚本:

onEdit 函数用作简单触发器。因此,为了运行脚本,请手动编辑单元格“B18”、“E18”、“H3”和“H4”之一。这样,脚本运行并从“B18”、“E18”、“H3”和“H4”的单元格中检索值,并将计算结果放入“D21:E22”的单元格中。

function onEdit(e) {
  var a1Notation = e.range.getA1Notation();  // Added
  if (a1Notation != "B18" && a1Notation != "E18" && a1Notation != "H3" && a1Notation != "H4") return;  // Added

  var betal = 0;
  var i = 1;
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getActiveSheet();
  var sum = activeSheet.getRange(18, 5).getValue();
  var ssum;
  var lsum;
  var ssumori = activeSheet.getRange(3, 8).getValue();
  var lsumori = activeSheet.getRange(4, 8).getValue();
  var fuld = activeSheet.getRange(18, 2).getValue();
  while(betal < sum){
    ssum = ((ssumori - fuld / 2) / 100) * i;
    lsum = ((lsumori - fuld / 2) / 100) * i;
    betal = ssum + lsum;
    i++;
  }

  if (betal > sum) {  // Modified
    var output = [[ssum,lsum], ["Samlet",betal]];
    var r = e.range.getSheet().getRange("D21:E22");
    r.clearContent();  // This line might not be required.
    r.setValues(output);
    SpreadsheetApp.flush();  // This line might not be required.
  }
}

参考资料:

【讨论】:

  • 感谢您的时间和精力!您的代码运行良好!
  • @Vegapunk 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
相关资源
最近更新 更多