问题:电子表格没有将输入日期识别为Date(),因此我无法从Apps脚本中获取.getTime()。
问题:你能明白这是为什么吗?
结果: 这是我正在运行的脚本的一部分:
dates.map(function(inp) {
if (inp != undefined && inp !== ""){
inp = new Date(inp.getTime() - (date.getTimezoneOffset()*60000);
return inp
}
});
其中dates
指的是范围:dates = sheet.getRange(2,1, lastR, 1).getValues();
目前此范围的手动输入值为“2017-05-20”,电子表格自动识别为“2017年5月20日星期五00:00:00 GMT + 0200(CEST)”
错误内容如下:
TypeError:在对象中找不到函数getTime 2017年5月20日00:00:00 GMT + 0200(CEST)。 (第86行,文件“代码”)详情解散
我已经在我的脚本中尝试了一百万种方法来让Spreadsheet停止将输入值自动转换为日期,这样我就可以制作至少时间戳等等。有谁知道它为什么会这样做?
答案 0 :(得分:3)
即使你在一列范围内调用getValues()
,它仍然是一个数组数组。
这里令人困惑的是,GAS尝试提供帮助并显示单元素数组中的唯一值。
从行中提取第一个元素应解决此问题。
dates.map(function(row) {
var inp = row[0];
if (inp != undefined && inp !== ""){
inp = new Date(inp.getTime() - (date.getTimezoneOffset()*60000);
return inp
}
});
答案 1 :(得分:0)
如果您坚持通过Array.prototype.map()执行所有操作,则以下代码可能有效。我忽略了你的日期操作逻辑,而是在单元格中添加了5天的日期。对于要更新的值,必须将Array.prototype.map()返回的任何内容分配给变量。另外,对空字符串和'undefined'进行2次单独检查是多余的,因为JavaScript实际上认为它们都是'false'(不幸的是,这也适用于0,所以要小心)
function getDates() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1);
var values = range.getValues();
var newValues = values.map(function(row) {
var newRow = row.map(function(value){
if (value){
value = new Date(value.getTime() + 3600000*24*5) // adding 5 days
return value;
}
});
return newRow;
});
range.setValues(newValues);
}
答案 2 :(得分:0)
我最终采纳了罗宾的建议,做了以下工作:
rows.map(function(r) {
r.day = new Date(r.day.getTime() - (date.getTimezoneOffset()*60000));
r.day = r.day.toISOString().split('T')[0];
return r
})
其中date被全局定义为date = new Date()
,“rows”表示包含数据的行,而“day”是列名(我之前在脚本中定义的第一行[0])对于我试图改变的日期列。
再次感谢!