【问题标题】:How can I simplify my google app script I copy/pasted multiple times for each of my different ranges?如何简化我为每个不同范围复制/粘贴多次的谷歌应用脚​​本?
【发布时间】:2021-09-08 11:51:57
【问题描述】:

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

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

plus1() 将 +1 加到 A1 中的值

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);
}

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

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

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 次相同的代码,只是范围不同?

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

【问题讨论】:

  • 你怎么称呼他们?您是否将它们附加到按钮上?
  • 我通过点击菜单栏来调用它们 (ui.createMenu('Add+1')
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

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


【解决方案1】:

我可能会将其设置为增量函数和单独的减量函数,并且只使用当前的活动范围。因此,您必须选择要递增或递减的单元格并按下递增或递减

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);
}

如果您将侧边栏用于此类常见的重复功能,它比使用下拉菜单方便得多。

【讨论】:

  • 谢谢。它对我不起作用,因为我无法使用当前的活动范围。
  • 当我需要增加或减少时,我在第 936 行,活动单元格在 C 列中
  • 我不明白,但没关系。
【解决方案2】:

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

# 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);
}

【讨论】:

  • 完美的尤里!!太感谢了!你的剧本只有我剧本的 1/3 的字符......你的看起来简单多了 - 再次感谢 Yuri!
【解决方案3】:

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

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);
}

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

如果这有帮助,请告诉我。

【讨论】:

  • 谢谢德米特里!我想单独添加或减去单元格,而不是一次全部。例如:今天早上我在单元格 A1 中加了 1。今天下午我在单元格 A3 中加了 1。很抱歉我不清楚。
  • 在这种情况下,您可能希望将单元格范围作为函数参数传递并像这样调用它:plusOne('A1')
  • 谢谢德米特里。每当我使用您的脚本时,我都必须定义范围,但随后我可以使用我的脚本并更改范围。
【解决方案4】:

在 Windows 上,您可以使用 Autohotkey

例如,使用此脚本,您可以通过单击 Alt+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

【讨论】:

  • 谢谢尤里。很遗憾,我无法在工作时在我的电脑上下载软件。
猜你喜欢
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多