【问题标题】:Change value of cell in same row with google script if column has certain value如果列具有特定值,则使用谷歌脚本更改同一行中单元格的值
【发布时间】:2014-12-30 05:26:31
【问题描述】:

我正在使用谷歌表格开发一个简单的产品跟踪工具。最上面一行包含一个产品的 1 到 13 个组件。当所有组件都被检查为已到达时,该行会自动将 R 列中的就绪状态更改为就绪。灰色区域用于确定哪些组件不属于某些产品。

这是文件。 https://docs.google.com/spreadsheets/d/18iX6Yp8SgfPaDRJC8L6f4xU1U9Gw8eiBINNFPT9r0Ow/edit?usp=sharing

这没问题,但是我希望在就绪状态更改后显示一个时间戳。

我找到了一段代码并对其进行了编辑以几乎满足我的需要。

function onEdit(event) {
var eventRange = event.range;
if (eventRange.getColumn() == 18) { // 18 == column R
var columnARange = SpreadsheetApp.getActiveSheet().getRange(eventRange.getRow(), 19,eventRange.getNumRows(), 19); // 19 == column S
var values = columnARange.getValues();
for (var i = 0; i < values.length; i++) {
   values[i][0] = new Date();
}
columnARange.setValues(values);
}
}

问题是因为它是一个 OnEdit 函数,如果我想要显示时间戳,我必须手动编辑指定的范围。在示例中,我在 R 列中的“1”上方链接生成时间戳,但是一旦所有空框都被划掉,将单元格更改为“就绪”的公式不会。

有没有办法编辑函数来查看工作表,如果在 R 列中找到“Ready”一词,在 S 列中它旁边会出现一个时间戳?

这个论坛已经帮助了我很多次,为此我感谢大家的贡献。

更新

我在这里找到了这段代码https://productforums.google.com/forum/#!topic/docs/3Iz9y9OSLMk

function emailSendingTrigger() {
var sheet = SpreadsheetApp.getActiveSheet();

if (sheet.getName() == "Sheet Name") {

var activeCell = sheet.getRange("F21");

 if (activeCell.getValue() <500) { 

 emailBALANCETE();



}
}

}

是否可以更改它以查看范围内的每个单元格并在单元格值更改为“就绪”时触发时间戳?

类似

For each cell in range
If value "Ready"
Offset.1 select.cell
set.value New Date()

现在我知道这绝对是不正确的,但也许可以让我对我的目标有所了解。

托蒂

【问题讨论】:

  • 您说当检查组件列时,Ready 列已更新——您是否使用脚本来完成此操作?如果是这样,为什么不让更新 Ready 列的脚本也添加时间戳?
  • 嗨瑞恩。不,它不是脚本。这也是一种选择,但我也不知道该怎么做。为了澄清,“就绪”消息通过 IF 公式显示。变成“Ready”的单元格包含这个 =IF(COUNTA(E2:Q2)=13;ʺReadyʺ;) 因为一个产品的最大组件数量是 13,当所有盒子都装满时,产品就完成了。
  • 做了更多的研究并更新了原始问题

标签: google-apps-script google-sheets


【解决方案1】:

公式和脚本的组合使用意味着它并不像应有的那么简单。如果您使用脚本来执行所有更改,则可以在脚本的其余部分运行时添加时间戳。

事实上,一种解决方案是让脚本每隔几分钟运行一次,以检查列“R”是否具有值“Ready”且列“S”是否没有时间戳,如果是这样 = 添加当前时间戳。

一个简单但不优雅的方法是:

function timestamp(){

  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow()

  for (var i = 1; i <= lastRow; i++){

    var readyRange = sheet.getRange([i], 18);
    var readyValues = readyRange.getValues();

    var timeRange = sheet.getRange([i], 19);
    var timeValues = timeRange.getValues();

    if (readyValues == 'Ready' && timeValues == ''){ // 
      timeRange.setValue(new Date());

      }
    }
}

这将遍历电子表格中的所有行并检查它们是否需要时间戳。然后你可以设置一个time trigger 让它每隔一段时间运行一次。

这适用于小型电子表格,但我已在几分钟内将其作为解决方案组合在一起,因此如果您打算将它用于数千行,则需要提高它的效率。

【讨论】:

  • @TottiP 正如我所说,这不是最有效的代码,但它为您提供了总体思路。如果您发现它有帮助,如果您不介意“接受”我的答案,按下答案旁边的勾直到它变成绿色,这会将其标记为有用的答案并给我互联网积分。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多