Google表单转日历脚本异常:事件时间显示0.0且丢失详情
Google日历事件创建脚本故障修复方案
问题背景
Google表单可正常同步数据至Google表格,但执行createCalendarEvent脚本创建日历事件时,事件时间显示为"0.0",且缺失起止时间、事件文本等核心信息。已尝试解绑并重建表单,调试时变量数据正常,但问题仍存在,该脚本此前稳定运行多年。
原问题代码
function createCalendarEvent() { var sheet = SpreadsheetApp.getActiveSheet(); var calendar = CalendarApp.getCalendarById('plazamarinamgr@gmail.com'); var startRow = 2; // First row of data to process-2 exempts header row var numRows = sheet.getLastRow(); // Number of rows to process var numColumns = sheet.getLastColumn(); var dataRange = sheet.getRange(startRow, 1, numRows-1, numColumns); var data = dataRange.getValues(); var complete = "Done"; for (var i = 0; i < data.length; ++i){ var row = data[i]; var timestamp = row[0]; //Timestamp var Duration = row[1]; //Duration var Contact = row[2]; //Contact var Phone = row[3]; //Phone var Email = row[4]; //Email var Address = row[5]; //Address var City = row[6]; //City var State = row[7]; //State var Zip = row[8]; //Zip var Start = row[9]; new Date //Start var End = row[10]; new Date //End var Type = row[11]; //Type var Make = row[12]; //Make var Length = row[13]; //Length var Beam = row[14]; //Beam var Draft = row[15]; //Draft var Electrical = row[16]; //Electrical var Notes = row[17]; //Notes var eventID = row[18]; //event marked Done if (eventID != complete){ var currentCell = sheet.getRange (startRow + i, numColumns); calendar.createEvent(Duration +' - '+Contact +' [P]',Start, End,{description:+Phone +' | '+Email+' | '+Type-'+Type+'|'+Make +' | Length-'+Length+'|+Beam-'+Beam +'| Draft-'+Draft+'|Electrical-'+Electrical+' |Notes-'+Notes +[P]ending [+]Confirmed [X]NoAvail [0]NoShow [1]Bill NOTE:24HR CANCELLATION REQUIRED'}); currentCell.setValue(complete);
核心问题分析
- 日期变量未正确转换:
var Start = row[9]; new Date仅将Start赋值为单元格原始值,后续的new Date是无效孤立语句,未将值转为Date对象。End变量同理,导致createEvent接收的不是合法时间对象,这是时间显示为"0.0"的根本原因。 - 描述字符串语法错误:存在多余的
+号(如+Phone)、错误的减号(Type-'+Type+'),且[P]ending等文本未用引号包裹,触发语法报错,导致事件文本无法正常生成。 - 代码结构不完整:
for循环和if语句均未闭合,脚本执行到一半会中断,无法完成事件创建流程。
修复后的完整代码
function createCalendarEvent() { var sheet = SpreadsheetApp.getActiveSheet(); var calendar = CalendarApp.getCalendarById('plazamarinamgr@gmail.com'); var startRow = 2; // 跳过表头,从第2行开始处理数据 var numRows = sheet.getLastRow(); // 获取需处理的总行数 var numColumns = sheet.getLastColumn(); // 获取表格总列数 var dataRange = sheet.getRange(startRow, 1, numRows - 1, numColumns); var data = dataRange.getValues(); var complete = "Done"; for (var i = 0; i < data.length; ++i) { var row = data[i]; var timestamp = row[0]; // 时间戳 var Duration = row[1]; // 时长 var Contact = row[2]; // 联系人 var Phone = row[3]; // 联系电话 var Email = row[4]; // 邮箱地址 var Address = row[5]; // 地址 var City = row[6]; // 城市 var State = row[7]; // 州/省份 var Zip = row[8]; // 邮编 // 将表格中的时间值转换为Date对象 var Start = new Date(row[9]); var End = new Date(row[10]); var Type = row[11]; // 类型 var Make = row[12]; // 品牌 var Length = row[13]; // 长度 var Beam = row[14]; // 船宽 var Draft = row[15]; // 吃水深度 var Electrical = row[16]; // 电力配置 var Notes = row[17]; // 备注信息 var eventID = row[18]; // 事件处理状态标记 if (eventID != complete) { var currentCell = sheet.getRange(startRow + i, numColumns); // 重构事件描述字符串,修复语法错误 var eventDescription = `${Phone} | ${Email} | ${Type} | ${Make} | Length-${Length} | Beam-${Beam} | Draft-${Draft} | Electrical-${Electrical} | Notes-${Notes} [P]ending [+]Confirmed [X]NoAvail [0]NoShow [1]Bill NOTE:24HR CANCELLATION REQUIRED`; // 创建日历事件 calendar.createEvent(`${Duration} - ${Contact} [P]`, Start, End, {description: eventDescription}); // 标记当前行为已处理 currentCell.setValue(complete); } } }
修复要点说明
- 时间类型转换:通过
new Date(row[9])将表格中的时间值转换为Calendar API可识别的Date对象,解决时间显示异常问题。 - 字符串拼接优化:使用模板字符串重构事件描述,修正符号错误,提升代码可读性,避免语法报错。
- 代码结构补全:补充
for循环和函数的闭合括号,确保脚本完整执行。
内容的提问来源于stack exchange,提问作者Plaza Marina Mgr
相关产品推荐
相关产品推荐

