google-apps-script - 检查特定文本的所有匹配列并应用时间戳
问题描述
我有一个包含多张工作表的 Google 表格,其中一张名为 Info。在此表上,L 列中的单元格通过从其他来源提取的 VLOOKUP 接收各种单词。我试图弄清楚如何让列中的相邻单元格在 L 列中的单元格第一次收到“开始”一词时收到一个近似的时间戳。
我认为这应该可以通过每小时运行一次的触发器来实现,检查 L 列是否有任何带有“START”字样的单元格,然后在 I 列各自的空单元格中插入时间戳。
当我在 L 列中选择了一个单元格时,我已经使用了一个非常适合单行的脚本,但是我该如何更改它以便无论我在哪里或我在工作表上做什么,它都可以工作?
function TIMESTAMP() {
var s = SpreadsheetApp.getActiveSheet();
if( s.getName() == 'Info' ) {
var r = s.getActiveCell();
if( r.getValue() == 'START' ) {
if( r.getColumn() == 12 )
var nextCell = r.offset(0, -3);
if( nextCell.getValue() === '' )
nextCell.setValue(new Date());
}
}
}
编辑
感谢库珀,这就是我最终的结果。我进行了一些编辑,因为前 4 行是包含公式的标题,并且每当函数运行时它们就会中断。现在这可以防止任何 VLOOKUP 被覆盖,这似乎解决了这个问题。
function TIMESTAMP() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Info');
var srg=sh.getRange(5,9,sh.getLastRow()-4);
var sA=srg.getValues();
var trg=sh.getRange(5,10,sh.getLastRow()-4);
var tA=trg.getValues();
for(var i=0;i<sA.length;i++) {
if(sA[i][0]=='START' && tA[i][0]=='') {
tA[i][0]=Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "MMM/dd/yyyy HH:mm:ss")
}
}
trg.setValues(tA);
}
解决方案
function TIMESTAMP() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Info');
var srg=sh.getRange(5,12,sh.getLastRow()-4,sh.getLastColumn());
var sA=srg.getValues();
var trg=sh.getRange(5,9,sh.getLastRow()-4,sh.getLastColumn());
var tA=trg.getValues();
for(var i=0;i<sA.length;i++) {
if(sA[i][0]=='START' && tA[i][0]=='') {
tA[i][0]=Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "dd/MM/yyyy HH:mm:ss")
}
}
trg.setValues(tA);
}
推荐阅读
- mobile - Foundation JS Orbits - 仅用于小型展示
- sql - 有条件的重复
- c# - ValidateCredentials 条件返回 false
- typescript - Typescript:用'this'获取自定义界面的类型?
- javascript - `return false && 是什么意思` 真的回来了?为什么它不会破坏我的 React 代码?
- css - 如何在引导导航栏中对齐 react-router NavLink?
- c - 如何检查C中是否存在长度大于PATH_MAX的路径
- javascript - 如何使用 Google 工作表中的值填充选择元素的下拉列表?
- javascript - 下载文件时在文件内容中获取类型 [object object],而不是使用 Angular 7 获取 blob
- c# - 创建客户端时,模拟的 HttpClientFactory 返回 null