我有一个包含三列的Google表格: - 日期和时间(时间戳) - 持续时间 - 说明
我有一个脚本,当我在'描述'中写入内容时,插入'日期'此时的日期和时间以及'持续时间':
function onEdit(e) {
if(e.source.getActiveSheet().getName() == "Sheet2" ) {
var col = e.source.getActiveCell().getColumn();
if(col == 3 ) {
// I'm in column three
var cellTimeStamp = e.range.offset(0,-2); // First column of the same row
var cellTimeDiff = e.range.offset(0,-1); // Second column of the same row
var cellTimePrev = e.range.offset(-1,-2); // First column of the previous row
var timeTimeStamp = new Date();
var iniTime = cellTimePrev.getValue().getTime();
var finTime = timeTimeStamp.getTime() ;
var timeDiff = String(finTime - iniTime) ;
cellTimeStamp.setValue(timeTimeStamp);
cellTimeDiff.setValue(timeDiff); // [***]
}
}
}
当这在'持续时间'的列中执行时(作为事件)没有格式为' HH:mm:ss'。
但是,如果我删除此脚本中的最后一行并在工作表中添加此公式: = A3-A2(第3行) = A4-A3(第4行) ... 那就行了。
我想知道如何使用脚本来达到相同的结果。
提前致谢。
答案 0 :(得分:1)
timeDiff是finTime - iniTime
的结果,它们都是native date object values,这意味着我们有毫秒。
转换为hh:mm:ss是简单的数学...:一分钟60秒,一小时60分钟...... 一个简单的代码可能是这样的:
function msToTime(s) {
var ms = s % 1000;
s = (s - ms) / 1000;
var secs = s % 60;
s = (s - secs) / 60;
var mins = s % 60;
var hrs = (s - mins) / 60;
return hrs + ':' + mins + ':' + secs; // milliSecs are not shown but you can use ms if needed
}
如果您更喜欢按常规方式格式化字符串(每个值2位数字),请不要忘记您可以使用Utilities.formatString()来执行此操作。
以下示例:
return Utilities.formatString("%02d",hrs) + ':' + Utilities.formatString("%02d",mins) + ':' + Utilities.formatString("%02d",secs);
发表评论:
电子表格比您想象的更聪明,您可以尝试下面的代码,您会看到结果实际上是时间值。(通过双击检查)
function test() {
var sh = SpreadsheetApp.getActiveSheet();
var t1 = sh.getRange('a1').getValue().getTime();
var t2 = sh.getRange('b1').getValue().getTime();
sh.getRange('c1').setValue(msToTime(t1-t2)).setNumberFormat('hh:mm:ss');
}
function msToTime(s) {
var ms = s % 1000;
s = (s - ms) / 1000;
var secs = s % 60;
s = (s - secs) / 60;
var mins = s % 60;
var hrs = (s - mins) / 60;
return hrs + ':' + mins + ':' + secs; // milliSecs are not shown but you can use ms if needed
}
注意 setNumberFormat('hh:mm:ss')
是可选的,它只是强制电子表格显示hour:min:sec
格式,但自动模式也可以。