【问题标题】:Google Spreadsheets tickbox increment and time-driven resetGoogle 电子表格复选框增量和时间驱动重置
【发布时间】:2018-09-09 16:04:07
【问题描述】:

我想在电子表格上使用复选框功能;当它在一天结束时打勾时,定义的单元格值将增加并且复选框将重置。

    function resetCells() {
var ss = SpreadsheetApp.getActive()
    .getSheetByName('Lordaeron');
var cells = ['B2:B1000']
    .map(function (c) {
        ss.getRange(c)
        .setValue("FALSE");
    });
}

这会重置带有时间触发器的复选框,我需要添加条件增量。如果 B 列值为 TRUE C 列值将在同一行中递增。

例子:

初始表>>

Checkbox |  Value 1 | Value 2 |  
-------------------------------
   X     |     1    |    0    | 
   V     |     2    |    0    |
   X     |     3    |    1    | 
   V     |     1    |    2    | 
   X     |     2    |    3    |

一天后【想要的结果】>>

Checkbox |  Value 1 | Value 2 |  
-------------------------------
   X     |     1    |    0    | 
   X     |     3    |    1    |
   X     |     3    |    1    | 
   X     |     2    |    3    | 
   X     |     2    |    3    |

https://docs.google.com/spreadsheets/d/1khPC5r2p0b1srsEGka3fl-GAl6nHACaVR0Cf31cqA1o/edit?usp=sharing 这是示例基础表。

提前致谢

===============================================

另外,我询问了如何将上限添加为 100 以不达到某个数字。 感谢 Tanaike,我通过此代码 sn-p 解决了问题:

function resetDaily() {
  var ss = SpreadsheetApp.getActive().getSheetByName('Sheet');
  var range = ss.getDataRange().offset(1, 0, ss.getLastRow() - 1);
  var values = range.getValues().map(function(e) {
    if (Number(e[8]) <= 94) {
    return e[0] ? [false, e[1], Number(e[2]) + 6, Number(e[3]) + 1] : e;
    } else {
      return e[0] ? [false, e[1], 100, Number(e[3]) + 1] : e;
    }
  }); 
  range.setValues(values);
}

【问题讨论】:

  • 什么阻止了你?你需要google-apps-script。开始并发布您的代码。
  • 在您的脚本中,您似乎尝试从 B 列中检索复选框的值。但在您的示例表中,它似乎被放到了 A 列。如果您的脚本不是最新的,请修改。为了正确理解您的情况,您能否提供一个示例电子表格?当然,请删除您的个人信息。
  • docs.google.com/spreadsheets/d/… 这是我想要实现的简单基础。如果在一天结束时选中复选框。出勤天数将增加+1,作业点数将增加+6,复选框检查将重置。
  • 感谢您的回复。我发布了一个答案,因为我认为我可以从您共享的电子表格和评论中了解您的情况。你能确认一下吗?如果我误解了你想要什么,请告诉我。我想修改它。

标签: checkbox google-apps-script google-sheets increment


【解决方案1】:
  • resetCells() 被安装为执行If tickbox is checked at the end of the day. 的时间触发器。这是您自己完成的。
  • resetCells() 运行时,它会检查“A”列的所有复选框。
  • 如果某行的复选框为false,则对该行不执行任何操作。
  • 如果一行的复选框是true,则对于该行,它将+6添加到“C”列的值,并将+1添加到“D”列的值。然后,它将行的“A”列的值更改为false

如果我对你的情况和你想要的理解是正确的,那么这个修改怎么样?我认为您的情况有几个答案。因此,请将此视为其中之一。

修改点:

  • 在您的脚本中,“A”列的所有值都更改为false。但无法检索原始值。所以没有修改“C”和“D”列的材料。
  • 修改后的脚本流程如下。
    1. 检索数据范围的所有值。
    2. 修改值。
    3. 使用修改后的值覆盖工作表。

修改后的脚本:

请按如下方式修改您的脚本。

function resetCells() {
  var ss = SpreadsheetApp.getActive().getSheetByName('Sheet');
  var range = ss.getDataRange().offset(1, 0, ss.getLastRow() - 1);
  var values = range.getValues().map(function(e) {
    return e[0] ? [false, e[1], Number(e[2]) + 6, Number(e[3]) + 1] : e;
  });
  range.setValues(values);
}

注意:

  • 如果经常出现“A”列的所有值都是false的情况,我认为可以通过包含检查“A”列值的脚本来降低流程成本。

补充:

在本次更新中,当“C”列的值为 100 时,脚本可以更改该值作为边界。

function resetCells() {
  var ss = SpreadsheetApp.getActive().getSheetByName('Sheet');
  var range = ss.getDataRange().offset(1, 0, ss.getLastRow() - 1);
  var values = range.getValues().map(function(e) {
    if (Number(e[2]) < 100) { // or <= 100
      return e[0] ? [false, e[1], Number(e[2]) + 6, Number(e[3]) + 1] : e;
    } else {
      // do something
    }
  });
  range.setValues(values);
}

【讨论】:

  • 这段代码包括我想要实现的一切。先生,非常感谢您的帮助和关心。非常感谢。
  • 我最近注意到,是否可以添加分配点的上限?例如不要超过 100
  • @Kutay 感谢您的回复。我很高兴你的问题得到了解决。关于你的新问题,有可能做到。所以我将更新的脚本添加到我的答案中。你能确认一下吗?我不确定您想要的规格。所以请将// do something替换成你想要的脚本。
  • @Kutay 对不起。添加脚本时,能否将其添加到您的问题中?
  • 我修好了。对不起,我还没用过stackoverflow。我还有更多问题,但我认为我应该为他们创建新线程。尊敬的先生,再次感谢您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多