GAS中Range.getValue()的奇怪返回值

时间:2015-08-13 06:24:14

标签: google-apps-script google-sheets

我有一个格式化为时间的单元格:

enter image description here

执行此调用:

Browser.msgBox(SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses 1').getRange('F6').getValue());

结果:

enter image description here

地球上是怎么回事?感谢。

3 个答案:

答案 0 :(得分:1)

你输入了.getStrange()...开玩笑;) 我有同样的,但我只在1900年1月1日前2天。你有没有尝试过其他时间?输入12:00:00

时我会得到这个
Sat Dec 30 1899 12:00:00 GMT+0100 (CET)

您可以通过此脚本确定以毫秒为单位的补偿来解决此问题:

function findDifferenceInTime() {
  var field = "A2";
  var range = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(field);
  var oldValue = range.getValue(), oldFormat = range.getNumberFormat();
  range.setNumberFormat("H:mm:ss");
  range.setValue(0);
  var value = range.getValue();
  range.setValue(oldValue);
  range.setNumberFormat(oldFormat);
  Logger.log("The time 0:00:00 will be represented as: " + - new Date(value).getTime());
  return - new Date(value).getTime();
}

然后用这个脚本纠正这个问题(这就是我如何解决hacky风格)

function test() {
  Logger.log(displayTime(getTime("A2")));
}

function getTime(range) {
  var value = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(range).getValue();
  var beginningOfTimes = findDifferenceInTime();
  var milliseconds = new Date(value).getTime() + beginningOfTimes;
  return milliseconds;
}

function displayTime(milliseconds) {
    var h = Math.floor(milliseconds/(60*60*1000));
    var m = (Math.floor(milliseconds/(60*1000))) % 60;
    var s = (Math.floor(milliseconds/1000)) % 60;
    return showTwoDigits(h) + ":" + showTwoDigits(m) + ":" + showTwoDigits(s);
}

function showTwoDigits(number) {
    return ("00" + number).slice(-2);
}

答案 1 :(得分:1)

另一个更简单的解决方案是暂时将格式转换为字符串,然后获取值:

function getValueAsText(range) {
  var oldFormat = range.getNumberFormat();
  range.setNumberFormat("@STRING@");
  var text = range.getValue();
  range.setNumberFormat(oldFormat);
  range.setValue(text);
  return text;
}

function testIt() {
  var range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form Responses 1').getRange('F6');
  Logger.log(getValueAsText(range));
}

答案 2 :(得分:0)

我认为最终的解决方案是电子表格中设置的时区(菜单文件 - >电子表格首选项)和脚本编辑器中设置的时区(菜单文件 - >项目属性)必须相同。如果您有时间区1:00巴黎和1:00柏林,那么您甚至会得到奇怪的结果。您还需要在脚本中再次将日期格式化为正确的时区:

null