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()
。