如何针对每个不同的范围多次简化我的 google 应用程序脚本 copy/pasted?

How can I simplify my google app script I copy/pasted multiple times for each of my different ranges?

我已经在 Whosebug 上搜索了解决方案,但没有成功。看来我不知道如何正确地“命名”我的问题...

我为我的 Google sheet 找到了两个功能,可以帮助我计算工作中的成功和失败。他们工作得很好。

plus1() 将 A1 中的值加 +1

function plus1() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var yesCount = ss.getRange("A1");
var yesAdd = yesCount.getValue();
yesCount.setValue(yesAdd+1);
}

minus1() 对 A1 中的值减 1:

function minus1() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var yesCount = ss.getRange("A1");
var yesAdd = yesCount.getValue();
yesCount.setValue(yesAdd-1);
}

我编辑了我的问题以进行澄清 我单独增加或减少单元格,而不是一次全部增加或减少。例如:今天早上我将 1 递增到单元格 A1。今天下午我将单元格 A1 减 3。 此外,我将这些脚本附加到带有 ui.createMenu.

的自定义菜单栏

我的问题: 我使用相同脚本的 6 倍,但范围不同:

1) plus1A() with Range A1
2) plus1B() with Range A2
3) plus1C() with Range A3
4) minus1A() with Range A1
5) minus1B() with Range A2
6) minus1C() with Range A3

我的问题:有没有办法简化脚本,这样我就不会得到 6 次相同的代码,只是范围不同?

非常感谢您抽出宝贵时间! 罗恩

您需要定义范围,获取范围值,遍历值,为每个值加一,然后将新值设置为您的初始范围,如下所示:

const plusOne = () => {
  const range = "A1:A5";
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const yesRange = ss.getRange(range);
  const yesValues = yesRange.getValues();
  const newValues = yesValues.map(row => row.map(cell => +cell + 1));
  yesRange.setValues(newValues);
}

已更新 根据您在下面的评论,使用参数:

const plusOne = range => {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const yesRange = ss.getRange(range);
  const yesValues = yesRange.getValues();
  const newValues = yesValues.map(row => row.map(cell => +cell + 1));
  yesRange.setValues(newValues);
}

这将适用于单个单元格或一系列单元格

如果有帮助请告诉我。

我可能会将其设置为一个递增函数和一个单独的递减函数,并且只使用当前的活动范围。因此,您必须 select 您希望递增或递减的单元格,然后推送递增或递减

function increment() {
  const ss = SpreadsheetApp.getActive();
  ss.getActiveCell().setValue(ss.getActiveCell().getValue() + 1);
}

function decrement() {
  const ss = SpreadsheetApp.getActive();
  ss.getActiveCell().setValue(ss.getActiveCell().getValue() - 1);
}

如果像这样对常见的重复功能使用侧边栏,它比使用下拉菜单方便得多。

在 Windows 您可以使用 Autohotkey

例如,使用此脚本,您可以通过单击 A​​lt+Numpad + 来增加或减少选定的单元格Alt+Nupmpad - 按钮分别为:

!NumpadAdd::
send ^c
sleep, 50
Clipboard := Clipboard + 1
send ^v
return

!NumpadSub::
send ^c
sleep, 50
Clipboard := Clipboard - 1
send ^v
return

如果您不介意有四个或六个或任意数量的独立函数,而您需要的只是让它们更简单,这里是可能的方法:

# six functions for custom menu

function a1_plus()  { change('a1',  1) }
function a1_minus() { change('a1', -1) }

function a2_plus()  { change('a2',  1) }
function a2_minus() { change('a2', -1) }

function a3_plus()  { change('a3',  1) }
function a3_minus() { change('a3', -1) }


# inner function

function change(range, value) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var r  = ss.getRange(range);
  var v  = r.getValue();
  r.setValue(v + value);
}