【问题标题】:google apps script - createEvent error indicating NaN谷歌应用程序脚本 - createEvent 错误指示 NaN
【发布时间】:2014-03-21 13:45:15
【问题描述】:

谁能帮助我解释为什么我在下面的代码中得到“NaN”的日期?我正在尝试创建一个日历事件,但它一直在 Logger.log 中指示“NaN”。执行记录显示如下;

“执行失败:找不到方法 createEvent(string,number,number)。(第 38 行,文件“代码”)”

这是代码的一部分。该脚本基于两个日期的表单提交运行。该脚本从电子表格中获取值。例如,这两个日期可能是 2014 年 4 月 1 日和 2014 年 4 月 2 日。

代码如下:

        var ptoCalendar = CalendarApp.getCalendarById("ENTER CALENDAR ID")

    var startDate = Utilities.formatDate(new Date(sheet.getRange(i,j-3,1,1).getValue()), 'GMT', "yyyy-MM-dd'T'HH:mm:ss");
    var cnvtStartDate = new Date(startDate).setHours(08,00,00);
    Logger.log(cnvtStartDate);

    var endDate = Utilities.formatDate(new Date(sheet.getRange(i,j-2,1,1).getValue()), 'GMT', "yyyy-MM-dd'T'HH:mm:ss");
    var cnvtEndDate = new Date(endDate).setHours(17,00,00);
    Logger.log(cnvtEndDate);        

    var createEvent = ptoCalendar.createEvent(recipientName+'- PTO', cnvtStartDate, cnvtEndDate);

任何帮助表示赞赏..

在 Serge 响应之前更新代码 - 我目前的解决方案。注意:我在这里提供完整的功能,和以前一样只是一个 sn-p

//This takes the date string from managersDecission() and covnerts back to a date type
function parseDate(dateString){
var time = Date.parse(dateString);
if(!time){
    time = Date.parse(dateString.replace("'T'"," "));
    if(!time){
        bound = dateString.indexOf('T');
        var dateData = dateString.slice(0, bound).split('-');
        var timeData = dateString.slice(bound+1, -1).split(':');

        time = Date.UTC(dateData[0],dateData[1]-1,dateData[2],timeData[0],timeData[1],timeData[2]);
    }
}
return new Date(time);
}

//Used to update the employee requested PTO in the request spreadsheet with managers decision
function managersDecission() {
//Section get the tracking spreadsheet and its values & requests the decision made by manager in grabRequestID()  
  var ss = SpreadsheetApp.openById(trackingSS)
  var sheet = ss.getSheetByName('Requests');
  var data = sheet.getDataRange().getValues();
  var decision = grabRequestID();

//for loop to set the decision of the manager for tracking  
  for (var i=0; i < data.length; i++) {
    for (var j=0; j < data[i].length; j++) {      
      if (data[i][j] == decision[0] && decision[1] == "Approved") {
    sheet.getRange(i+1,j+3,1,1).setValue(decision[1]);
    var recipientEmail = sheet.getRange(i+1,j,1,1).getValue();
    var recipientName = sheet.getRange(i+1,j-1,1,1).getValue();

//This section creates the calendar event for approved PTO        
    var ptoCalendar = CalendarApp.getCalendarById('CALENDAR ID')        
    var startDate = Utilities.formatDate(new Date(sheet.getRange(i+1,j-3,1,1).getValue()), 'GMT', "yyyy-MM-dd'T'HH:MM:SS");
//Debug Line
//Logger.log("start date is "+startDate)  
    var cnvtStartDate = parseDate(startDate);
//Debug Line
//Logger.log("parsed start date "+cnvtStartDate);
    var setHourStartDate = cnvtStartDate.setHours(08,00,00,00);
//Debug Line
//Logger.log("start Hours set "+setHourStartDate);        
    var endDate = Utilities.formatDate(new Date(sheet.getRange(i+1,j-2,1,1).getValue()), 'GMT', "yyyy-MM-dd'T'HH:MM:SS");
//Debug Line
//Logger.log("end date is "+endDate);
    var cnvtEndDate = parseDate(endDate);
//Debug Line
//Logger.log("parse end date "+cnvtEndDate);
    var setHourEndDate = cnvtEndDate.setHours(15,00,00,00);
//Debug Line
//Logger.log("end Hours set "+setHourEndDate);        
    var createEvent = ptoCalendar.createEvent(recipientName+'- PTO', cnvtStartDate, cnvtEndDate);

为 SERGE 的以下评论添加日志信息

[14-03-20 16:08:05:541 PDT] start date is 2014-03-31T07:03:00
[14-03-20 16:08:05:545 PDT] parsed start date Mon Mar 31 2014 00:03:00 GMT-0700 (PDT)
[14-03-20 16:08:05:545 PDT] start Hours set 1396278000000
[14-03-20 16:08:05:546 PDT] end date is 2014-04-02T07:04:00
[14-03-20 16:08:05:547 PDT] parse end date Wed Apr 02 2014 00:04:00 GMT-0700 (PDT)
[14-03-20 16:08:05:547 PDT] end Hours set 1396476000000

已更新基于 Serge 注释的一些测试表明 cnvtStartDate 是一个日期对象

我删除了 Utilities.formatDate,实际上从电子表格中提取的值是一个日期值,将允许脚本成功运行。问题是为 12:00 AM 创建日历事件。由于这应该会阻止一个完整的工作日(PTO 日),我需要它为开始/结束设置一些时间。

现在运行脚本并使用以下内容时:

var startDate =new Date(sheet.getRange(i+1,j-3,1,1).getValue());
var setHourStartDate = startDate.setHours(08,00,00,00);
var endDate = new Date(sheet.getRange(i+1,j-2,1,1).getValue());
var setHourEndDate = cnvtEndDate.setHours(15,00,00,00);
var createEvent = ptoCalendar.createEvent(recipientName+'- PTO', setHourStartDate, setHourEndDate);

以下错误正在给出。它认为 ssetHourStartDate 和 end 是一个数字??

“执行失败:找不到方法 createEvent(string,number,number)。”

然后我将他的代码调整为以下:

    var startDate =new Date(sheet.getRange(i+1,j-3,1,1).getValue());
    var setHourStartDate = new Date(startDate.setHours(08,00,00,00));
    var endDate = new Date(sheet.getRange(i+1,j-2,1,1).getValue());
    var setHourEndDate = new Date(endDate.setHours(17,00,00,00));   

    var createEvent = ptoCalendar.createEvent(recipientName+'- PTO', setHourStartDate, setHourEndDate);

一切运行良好。它将为全天创建单日事件或跨越日历顶部的多天。

感谢 Serge 一如既往地指出问题..

【问题讨论】:

标签: javascript google-apps-script


【解决方案1】:

你为什么首先使用Utilities.formatDate

如果工作表中的单元格是日期,则不需要将其转换为字符串,直接使用即可。

如果您真的想以这种方式使用它,请使用正确的语法,如下所示:

  var cnvtStartDate = new Date("2014/03/20"):// I replaced with the string "as it should be"
  cnvtStartDate.setHours(8,0,0,0);
  Logger.log(cnvtStartDate);// this is a date object

【讨论】:

  • 我会测试一下看看。如果我没记错的话,当我将电子表格值放入 new Date() 时,它给了我有趣的结果。原因是,我试图让它始终是一个特定的时间,这样当创建日历时,它会是上午 8 点到下午 5 点。我正在更新我现在的工作。也许您可以查看并提供反馈以使其更顺畅。它可能有很多额外的代码。
  • 无论出于何种原因,utilties.formatDate 都不是一个好主意。此方法可用于显示日期,仅此而已。你的工作表中的数据是什么?登录时它是如何显示的?
  • 用日志信息更新了我的原始帖子以获取您的上述评论。
  • 感谢您接受 ;) 顺便说一句,您可以通过将 setHours 方法分隔在另一行代码中来稍微简化代码(就像我在回答中所做的那样),因为当您将它与 new Date( ) 结果是一个数字(以毫秒为单位的日期的本机值)。在单独的行中使用时不会发生这种情况。不要问我为什么....我对JavaScript的了解还不够深,无法回答^^,但我从经验中注意到了这一点。也就是说,它只会保留一个新的 Date 声明,没什么大不了的!。
  • 感谢您的信息。我正在自学谷歌应用程序脚本(编程),所以更高效总是好的。我认为在整个项目中,还有很大的清理空间。即对重复的代码行使用函数。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多