在提交获取值和格式化时间谷歌表(Google Form on Submit get values a

2019-10-19 14:52发布

我使用谷歌Apps脚本与谷歌的形式。 当用户提交的谷歌表格我从一个问题的值。 然后我采取这一价值并使其约会对象,从我在这看到了一篇关于夏令我用它来确定的时区。 我贯穿Utilities.formatDate Date对象,并希望得到正确格式的日期。

例如:上午9:00

而是我得到比预期完全不同的时间。

我的问题是:是否有人可以帮助我了解为什么下面的代码输出时间为3小时不同?

function onSubmit(e) {

  var values = e.values;  
  Logger.log(values);

  try {    
    var start1 = new Date(values[3]);
    var startN = new Date(start1).toString().substr(25,6)+"00";
    var startT = Utilities.formatDate(start1, startN, "h:mm a");
    Logger.log(startT);

  } catch(error) {
    Logger.log(error);
  }
}

Answer 1:

公用事业formatDate不支持GMT假设...参数是不正确的。

你参考提到的职位是用来获取日历事件,是一个非常有用的方式,当你从另一个夏令时(正从日历事件本身的TZ资讯)事件,以得到正确的值,为下月例如事件将在“夏令时间”,而我们仍处于“冬天的时候” ......

这取决于你的脚本VS源的时区的时区设置你的问题可能来自不同的来源。 你能描述在你使用这个脚本的具体配置?

与此同时,这里是一个演示代码是如何工作的+记录结果一个小代码:

function testOnSubmit() {
  var eventInfo = {};
  var values = {};  
  values['3'] = new Date();
  eventInfo['values'] = values;
  Logger.log('eventInfo = '+JSON.stringify(eventInfo)+'\n\n');
  onSubmit(eventInfo);
}

function onSubmit(e) {
  var values = e.values;  
  try {    
    var start1 = new Date(values[3]);
    Logger.log('onSubmit log results : \n');
    Logger.log('start1 = '+start1)
    var startN = new Date(start1).toString().substr(25,6)+"00";
    Logger.log('startN = '+startN);
    var startT = Utilities.formatDate(start1, startN, "h:mm a");
    Logger.log('result in timeZone = '+startT);
  } catch(error) {
    Logger.log(error);
  }
}

编辑:另外,约30和45'的偏移,这可以容易地通过改变这样的子串长度解决:

var startN = new Date(start1).toString().substr(25,8);

结果是一样的,我不得不因为谷歌在某一时刻(改Utilities.formatDate方法几年前使用其他版本的问题,2204 ),但是这已得到修复。

编辑2:在同一个主题,这两种方法实际上返回相同的结果,GMT字符串只有你不必知道确切的时区名称的优势...还有的Session.getScriptTimeZone()方法。 下面是一个演示脚本,显示在一月份和7月2日与日期日志结果沿着resulst:

function testOnSubmit() {
  var eventInfo = {};
  var values = {};  
  values['3'] = new Date(2014,0,1,8,0,0,0);
  eventInfo['values'] = values;
  Logger.log('eventInfo = '+JSON.stringify(eventInfo)+'\n\n');
  onSubmit(eventInfo);
  values['3'] = new Date(2014,6,1,8,0,0,0);
  eventInfo['values'] = values;
  Logger.log('eventInfo = '+JSON.stringify(eventInfo)+'\n');
  onSubmit(eventInfo);
}

function onSubmit(e) {
  var values = e.values;  
  var start1 = new Date(values[3]);
  Logger.log('onSubmit log results : ');
  Logger.log('start1 = '+start1)
  var startN = new Date(start1).toString().substr(25,8);
  Logger.log('startN = '+startN);
  Logger.log('result in timeZone using GMT string = '+Utilities.formatDate(start1, startN, "MMM,d  h:mm a"));
  Logger.log('result in timeZone using Joda.org string = '+Utilities.formatDate(start1, 'Europe/Brussels', "MMM,d  h:mm a"));
  Logger.log('result in timeZone using Session.getScriptTimeZone() = '+Utilities.formatDate(start1, Session.getScriptTimeZone(), "MMM,d  h:mm a")+'\n');
}

还要注意的是,记录仪有其自己的方式来显示日期对象的值! 它采用ISO 8601时间格式为UTC值。



Answer 2:

试试这个:

var timeZone = Session.getScriptTimeZone();
var startT = Utilities.formatDate(start1, timeZone, "h:mm a");

所述Utilities.formatDate函数需要,是一个有效IANA时区(如时区America/Los_Angeles ),而不是一个GMT的偏移等GMT+0700

我想提出的是,假设Session.getScriptTimeZone()返回相应的区域。 如果没有,那么你可能需要硬编码特定的区域,或者使用不同的功能,以确定它。

此外, +"00"在你有剧本假设所有时区使用整个小时的偏移量。 在现实中,有几个是有30分钟或45分钟的偏移。



文章来源: Google Form on Submit get values and format the time