onEdit() 触发器删除已编辑的单元格 eventId,然后创建新单元格
onEdit() trigger to delete edited cells eventId and then create new one
我有以下脚本,当调用该脚本时,将根据来自 google 工作表的输入在 google 日历中创建事件。 'onOpen()' 和 'scheduleShifts()' 函数按预期工作,如果您有任何改进,我将非常乐意实现它们。
function onOpen(){
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu("Sync to Calendar")
menu.addItem("Schedule Shifts Now", "scheduleShifts")
menu.addToUi();
}
function scheduleShifts(){
var spreadsheet = SpreadsheetApp.getActiveSheet();
var calendarId = spreadsheet.getRange("C4").getValue();
var eventCal = CalendarApp.getCalendarById(calendarId);
var signups = spreadsheet.getRange("A8:D12").getValues();
for (let x = 0; x < signups.length; x++) {
var shift = signups[x];
var startTime = shift[0];
var endTime = shift[1];
var volunteer = shift[2];
var eventId = shift[3];
if (eventId == ""){
var newEvent = eventCal.createEvent(volunteer, startTime, endTime);
var newEventId = newEvent.getId();
spreadsheet.getRange(8 + x, 4).setValue(newEventId);
}
}
}
我遇到的问题是基于 onEdit() 触发器,我希望触发器删除与编辑数据对应的 eventId,在这种情况下,它只是事件的标题,然后创建一个基于编辑数据的新事件。但是,当我编辑单元格数组中的数据时,google 日历中没有任何更改。对此问题的任何帮助将不胜感激。
function onEdit(e){
var editedData = e.source.getActiveSheet().getRange(8, 3, 1, 5).getValues()[2];
var event = editedData[3]
try{
// print(event);
event.deleteEventSeries();
shift[3] = '';
}
catch(e){
}
}
为清楚起见,google 表格中的列为:开始时间/结束时间/志愿者/事件 ID。数据来自单元格范围 A8:D12
主要问题:
- 您正在使用一个简单的触发器,它不能用于访问需要授权的服务(参见 Simple Triggers > Restrictions)。
onEdit
函数没有检查编辑的单元格是否在正确的范围内。
onEdit
函数不检索日历事件,只是一个 undefined
值,因为数组 e.source.getActiveSheet().getRange(8, 3, 1, 5).getValues()
只有一个元素。
解决方案:
- Install your
onEdit
trigger. You can do that manually, following these steps,或以编程方式执行一次 installTrigger
(参见下面的代码示例)。
- 使用 event object 检查在删除相应事件之前编辑了哪个单元格。
- 调用 CalendarApp.getEventById(iCalId) 获取您要检索的日历事件。
代码示例:
function installTrigger() {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger("onEditTrigger")
.forSpreadsheet(ss)
.onEdit()
.create();
}
function onEditTrigger(e) {
var range = e.range;
var FIRST_ROW = 8; // First row to check
var LAST_ROW = 12; // Last row to check
var TITLE_COL = 3; // Column index where to check changes
var ID_COL = 5; // Column index with event id
var colIndex = range.getColumn();
var rowIndex = range.getRow();
if (colIndex === TITLE_COL && rowIndex >= FIRST_ROW && rowIndex <= LAST_ROW) {
var sheet = range.getSheet();
var eventIdRange = sheet.getRange(rowIndex, ID_COL);
var eventId = eventIdRange.getValue();
var event = CalendarApp.getEventById(eventId);
event.deleteEvent();
eventIdRange.setValue("");
}
}
其他问题:
在您提供的电子表格中,eventId 位于 E 列,但根据 scheduleShifts
,它们位于 D 列(对应于电子表格中的 Description
)。我建议您相应地修改您的功能:
function scheduleShifts(){
var spreadsheet = SpreadsheetApp.getActiveSheet();
var calendarId = spreadsheet.getRange("C4").getValue();
var eventCal = CalendarApp.getCalendarById(calendarId);
var signups = spreadsheet.getRange("A8:E12").getValues();
for (let x = 0; x < signups.length; x++) {
var shift = signups[x];
var startTime = shift[0];
var endTime = shift[1];
var volunteer = shift[2];
var description = shift[3];
var eventId = shift[4];
if (eventId == ""){
var newEvent = eventCal.createEvent(volunteer, startTime, endTime);
var newEventId = newEvent.getId();
spreadsheet.getRange(8 + x, 5).setValue(newEventId);
}
}
}
我有以下脚本,当调用该脚本时,将根据来自 google 工作表的输入在 google 日历中创建事件。 'onOpen()' 和 'scheduleShifts()' 函数按预期工作,如果您有任何改进,我将非常乐意实现它们。
function onOpen(){
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu("Sync to Calendar")
menu.addItem("Schedule Shifts Now", "scheduleShifts")
menu.addToUi();
}
function scheduleShifts(){
var spreadsheet = SpreadsheetApp.getActiveSheet();
var calendarId = spreadsheet.getRange("C4").getValue();
var eventCal = CalendarApp.getCalendarById(calendarId);
var signups = spreadsheet.getRange("A8:D12").getValues();
for (let x = 0; x < signups.length; x++) {
var shift = signups[x];
var startTime = shift[0];
var endTime = shift[1];
var volunteer = shift[2];
var eventId = shift[3];
if (eventId == ""){
var newEvent = eventCal.createEvent(volunteer, startTime, endTime);
var newEventId = newEvent.getId();
spreadsheet.getRange(8 + x, 4).setValue(newEventId);
}
}
}
我遇到的问题是基于 onEdit() 触发器,我希望触发器删除与编辑数据对应的 eventId,在这种情况下,它只是事件的标题,然后创建一个基于编辑数据的新事件。但是,当我编辑单元格数组中的数据时,google 日历中没有任何更改。对此问题的任何帮助将不胜感激。
function onEdit(e){
var editedData = e.source.getActiveSheet().getRange(8, 3, 1, 5).getValues()[2];
var event = editedData[3]
try{
// print(event);
event.deleteEventSeries();
shift[3] = '';
}
catch(e){
}
}
为清楚起见,google 表格中的列为:开始时间/结束时间/志愿者/事件 ID。数据来自单元格范围 A8:D12
主要问题:
- 您正在使用一个简单的触发器,它不能用于访问需要授权的服务(参见 Simple Triggers > Restrictions)。
onEdit
函数没有检查编辑的单元格是否在正确的范围内。onEdit
函数不检索日历事件,只是一个undefined
值,因为数组e.source.getActiveSheet().getRange(8, 3, 1, 5).getValues()
只有一个元素。
解决方案:
- Install your
onEdit
trigger. You can do that manually, following these steps,或以编程方式执行一次installTrigger
(参见下面的代码示例)。 - 使用 event object 检查在删除相应事件之前编辑了哪个单元格。
- 调用 CalendarApp.getEventById(iCalId) 获取您要检索的日历事件。
代码示例:
function installTrigger() {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger("onEditTrigger")
.forSpreadsheet(ss)
.onEdit()
.create();
}
function onEditTrigger(e) {
var range = e.range;
var FIRST_ROW = 8; // First row to check
var LAST_ROW = 12; // Last row to check
var TITLE_COL = 3; // Column index where to check changes
var ID_COL = 5; // Column index with event id
var colIndex = range.getColumn();
var rowIndex = range.getRow();
if (colIndex === TITLE_COL && rowIndex >= FIRST_ROW && rowIndex <= LAST_ROW) {
var sheet = range.getSheet();
var eventIdRange = sheet.getRange(rowIndex, ID_COL);
var eventId = eventIdRange.getValue();
var event = CalendarApp.getEventById(eventId);
event.deleteEvent();
eventIdRange.setValue("");
}
}
其他问题:
在您提供的电子表格中,eventId 位于 E 列,但根据 scheduleShifts
,它们位于 D 列(对应于电子表格中的 Description
)。我建议您相应地修改您的功能:
function scheduleShifts(){
var spreadsheet = SpreadsheetApp.getActiveSheet();
var calendarId = spreadsheet.getRange("C4").getValue();
var eventCal = CalendarApp.getCalendarById(calendarId);
var signups = spreadsheet.getRange("A8:E12").getValues();
for (let x = 0; x < signups.length; x++) {
var shift = signups[x];
var startTime = shift[0];
var endTime = shift[1];
var volunteer = shift[2];
var description = shift[3];
var eventId = shift[4];
if (eventId == ""){
var newEvent = eventCal.createEvent(volunteer, startTime, endTime);
var newEventId = newEvent.getId();
spreadsheet.getRange(8 + x, 5).setValue(newEventId);
}
}
}