Google apps script 谷歌应用程序分钟计时器未启动

Google apps script 谷歌应用程序分钟计时器未启动,google-apps-script,google-calendar-api,google-sheets-api,Google Apps Script,Google Calendar Api,Google Sheets Api,我不是程序员,我是教师和教学技术专家。我正在尽我最大的努力找出如何创建一些基本的脚本,以帮助我的学校通过谷歌应用程序简化一些流程,我遇到了一个非常恼人和持久的问题。我的同事和我拼凑了一个脚本,该脚本通过谷歌表单提供的谷歌表单中的响应创建日历事件。我们正在脚本上运行“向下复制”加载项,以便连接组成日历事件的“描述”字段的一些字段,当手动运行时,整个脚本工作得非常出色。我们希望它每分钟运行一次,这样它就可以在“复制关闭”运行后捕获任何新提交的内容。问题是触发器不会运行,也不会向我们发送错误。没有什么

我不是程序员,我是教师和教学技术专家。我正在尽我最大的努力找出如何创建一些基本的脚本,以帮助我的学校通过谷歌应用程序简化一些流程,我遇到了一个非常恼人和持久的问题。我的同事和我拼凑了一个脚本,该脚本通过谷歌表单提供的谷歌表单中的响应创建日历事件。我们正在脚本上运行“向下复制”加载项,以便连接组成日历事件的“描述”字段的一些字段,当手动运行时,整个脚本工作得非常出色。我们希望它每分钟运行一次,这样它就可以在“复制关闭”运行后捕获任何新提交的内容。问题是触发器不会运行,也不会向我们发送错误。没有什么可调试的。脚本在下面,我想知道是否有人有任何想法来帮助我们。我们已经尝试将分钟计时器的脚本写入到脚本中,如另一篇文章所示,但它只是每分钟复制一次触发器,直到它出错为止。脚本如下,任何帮助都将不胜感激。对不起,我不能正确地制作这种浆糊

    //insert your google calendar ID
var calendarId = "eths202.org_2d3933323533323433393439@resource.calendar.google.com";

//index (starting from 1) of each column in the sheet
var titleIndex = 15;
var descriptionIndex = 16;
var startDateIndex = 11;
var endDateIndex = 12;
var locationIndex = 10;
var googleCalendarIndex = 18;


/*
find the row where the Google Calendar Event ID is blank or null
The data of this row will be used to create a new calendar event
*/


function findRow(sheet) {
 var sheet = SpreadsheetApp.getActiveSheet();
 var dataRange = sheet.getDataRange();
 var values = dataRange.getValues();

 for (var i = 0; i < values.length; i++) {
 if(values[i][googleCalendarIndex-1]=="" || values[i][googleCalendarIndex-1]==null)
 newEvent(i+1);
 } 
 };


/* 
get the data of the new row by calling getSheetData() and 
create a new Calendar event by calling submitToGoogleCalendar()
*/

function newEvent(row){ 
 var sheet = SpreadsheetApp.getActiveSheet();
 var eventId = submitToGoogleCalendar(getSheetData(sheet,row),null)
 if(eventId!=null) 
 sheet.getRange(row,googleCalendarIndex,1,1).setValue(eventId);
};


/* 
Store the data of a row in an Array
*/

function getSheetData(sheet,row)
{
 var data = new Array();

 data.title = sheet.getRange(row,titleIndex,1,1).getValue();
 data.description = sheet.getRange(row,descriptionIndex,1,1).getValue();
 data.startDate = sheet.getRange(row,startDateIndex,1,1).getValue();
 data.endDate = sheet.getRange(row,endDateIndex,1,1).getValue();
 data.location = sheet.getRange(row,locationIndex,1,1).getValue();

 return data; 
};

/* 
if a cell is edited in the sheet, get all the data of the corresponding row and 
create a new calendar event (after deleting the old event) by calling submitToGoogleCalendar() 
*/

function dataChanged(event){

 var sheet = SpreadsheetApp.getActiveSheet();
 var row = event.range.getRow();

 var eventId = sheet.getRange(row,googleCalendarIndex,1,1).getValue();

 var eventId = submitToGoogleCalendar(getSheetData(sheet,row),eventId)

 if(eventId!=null)
 sheet.getRange(row,googleCalendarIndex,1,1).setValue(eventId);

};


/* 
This function creates an event in the Google Calendar and returns the calendar event ID 
which is stored in the last column of the sheet 
*/
function submitToGoogleCalendar(sheetData,eventId) {
 // some simple validations ;-)
 if(sheetData.title == "" || sheetData.startDate == "" || sheetData.startDate == null)
 return null;

 var cal = CalendarApp.getCalendarById(calendarId);
 var start = new Date(sheetData.startDate);
 var end = new Date(sheetData.endDate);
 //end.setHours(23);
//end.setMinutes(59);
 //end.setSeconds(59);

 // some simple date validations
 if(start > end)
 return null;

 var event = null;

 //if eventId is null (when called by newEvent()) create a new calendar event
 if(eventId==null)
 {
 event = cal.createEvent(sheetData.title, start, end, {
 description : sheetData.description, 
 location: sheetData.location,
 });
 return event.getId(); 
 }
 /*
 else if the eventid is not null (when called by dataChanged()), delete the calendar event 
 and create a new event with the modified data by calling this function again
 */
 else
 {
 event = cal.getEventSeriesById(eventId);
 event.deleteEventSeries(); 
 return submitToGoogleCalendar(sheetData,null);
 }

 return event.getId();

};
//插入您的谷歌日历ID
var calendarId=“eths202.org_2d3933323533323433393439@resource.calendar.google.com";
//表中每列的索引(从1开始)
var titleIndex=15;
变量描述指数=16;
var startDateIndex=11;
var endDateIndex=12;
var位置指数=10;
谷歌日历指数var=18;
/*
查找Google日历事件ID为空或空的行
此行的数据将用于创建新的日历事件
*/
函数findRow(表){
var sheet=SpreadsheetApp.getActiveSheet();
var dataRange=sheet.getDataRange();
var values=dataRange.getValues();
对于(变量i=0;i结束)
返回null;
var事件=null;
//如果eventId为null(当newEvent()调用时),则创建一个新的日历事件
if(eventId==null)
{
事件=cal.createEvent(sheetData.title、开始、结束、{
说明:sheetData.description,
位置:sheetData.location,
});
return event.getId();
}
/*
否则,如果eventid不为null(由dataChanged()调用时),则删除日历事件
并通过再次调用此函数,使用修改后的数据创建一个新事件
*/
其他的
{
event=cal.getEventSeriesById(eventId);
deleteEventSeries();
返回submitToGoogleCalendar(sheetData,null);
}
return event.getId();
};

您应该使用“表单提交”触发器。在你的情况下,创建一个每分钟都在运行的触发器是不好的。“表内提交”可以安装在G表a表G表中,也可以同时安装。触发器有两种类型:简单触发器和可安装触发器。您需要“安装”触发器,这意味着,在代码编辑器中,单击“资源”菜单,然后单击“当前项目的触发器”菜单项,并添加一个新触发器。如果您已经安装了一个每分钟运行一次的触发器,那么显然您已经知道了这一点。:)谢谢,桑迪。我们需要使用分钟计时器的原因是,我们正在使用“向下复制”,它需要在脚本之前运行,以便为日历事件提供正确的字段。根据我们的经验,onformsubmit触发器发生得太快,以至于我们的复制无法运行。如果您知道一种方法,可以先运行Copy Down,然后再运行form submit触发器,这将解决此问题。我们只是没有让它发挥作用。谢谢您的电子表格是否包含多张工作表?如果是这样的话,可能是触发器用
SpreadsheetApp.getActiveSheet()
抓取了错误的触发器。另外,我建议您调用
抛出“testerror”
位于
findRow
功能的顶部,查看它是否会报告到您的电子邮件中。如果有效,那么尝试抛出sheet.getName()右下方
SpreadsheetApp.getActiveSheet()