在Google表格中的同一功能中添加多个范围

时间:2019-01-21 14:51:40

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

我最近开始为Google表格编写简单的函数,并且希望将以下函数扩展到所有范围: D10:D12,H10:H12,D16:D18,H16:H18,D22:D24,H22:H24,D28:D30,H28:H30,D34:D36和H34:H36。

getRange括号中的内容的语法是什么?

function nextRound() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var spreadsheet = SpreadsheetApp.getActive();
 var cell = spreadsheet.getRange("D10");
 var cellValue = cell.getValue();

  cell.setValue(cellValue - 1);
}

由于此功能对单元格D10正常起作用,但是如果我将D10更改为D10:D12,它将把D10 -1的销售价值放在其他两个单元格中,这不是我想要的。运行该函数时,我希望D10中的新值是D10-1(因为当前有效),但是D11中的新值是D11-1,等等。

哦,如果可能的话,我还要向按钮添加第二个功能,以在其中一个单元格达到0或负数时清除来自同一范围单元格的数据。

Example

1 个答案:

答案 0 :(得分:1)

  1. 您要为D10:D12,H10:H12,D16:D18,H16:H18,D22:D24,H22:H24,D28:D30,H28:H30,D34:D36和H34的所有单元格加1: H36。
  2. 您要在单元格的值小于0时清除单元格。

如果我的理解正确,那么这个答案如何?我针对您的情况使用了Sheets API的Values.batchGet()和Values.batchUpdate()的2种方法,因为在这种情况下,我认为Sheets API的处理成本低于gets的getValues()和setValues()的处理成本。 SpreadsheetApp。因此,我认为您的情况有几个答案。因此,请仅考虑其中之一。

使用表格API时,请在高级Google服务和API控制台上启用表格API。您可以在here上查看有关如何启用Sheets API的信息。

问题1:

请如下修改nextRound()

function nextRound() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheet = SpreadsheetApp.getActive();
  var id = ss.getId();
  var sheetName = spreadsheet.getSheetName();
  var ranges = ["D10:D12", "H10:H12", "D16:D18", "H16:H18", "D22:D24", "H22:H24", "D28:D30", "H28:H30", "D34:D36", "H34:H36"];
  ranges = ranges.map(function(e) {return sheetName + "!" + e});
  var r = Sheets.Spreadsheets.Values.batchGet(id, {ranges: ranges});
  var resource = {
    data: r.valueRanges.map(function(e) {return {
      range: e.range,
      values: e.values.map(function(f) {return [Number(f[0]) + 1]}),
    }}),
    valueInputOption: "USER_ENTERED",
  };
  Sheets.Spreadsheets.Values.batchUpdate(resource, id);
}

问题2:

请按如下所示修改“问题1”的脚本。

从:
values: e.values.map(function(f) {return [Number(f[0]) + 1]}),
至:
values: e.values.map(function(f) {return [Number(f[0]) <= 0 ? "" : Number(f[0])]}),

注意:

  • 关于“对于问题2”,关于“清除”,您说,我了解您要删除该值。如果您想输入其他值,请对其进行修改。
  • 如果要在多个单元格为空的情况下运行“对于问题2”的脚本,请进行以下修改。
    • values: e.values.map(function(f) {return [Number(f[0]) <= 0 ? "" : Number(f[0]) || ""]}),

参考文献:

如果我误解了您的问题,请告诉我。我想修改它。

编辑:

错误的原因是由于单元格为空。因此,请进行如下修改。

对于问题1的脚本,请进行以下修改。

从:
values: e.values.map(function(f) {return [Number(f[0]) + 1]}),
至:
values: e.values ? e.values.map(function(f) {return [f[0] ? Number(f[0]) + 1 : ""]}) : null,

对于问题2的脚本,请进行以下修改。

从:
values: e.values.map(function(f) {return [Number(f[0]) <= 0 ? "" : Number(f[0])]}),
至:
values: e.values ? e.values.map(function(f) {return [Number(f[0]) <= 0 || !f[0] ? "" : Number(f[0])]}) : null,