Apps 脚本:批量创建日历事件而不创建重复项
Apps Script: Batch Create Calendar Events without Creating Duplicates
我正在编写一个脚本,该脚本从 Google 工作表中获取任务列表并自动在 Google 日历上创建事件,将事件放在团队成员的日历上任务已申请。
一切正常,现在我的问题是我希望能够在添加任务时在整个单元格范围内 运行 脚本,而不创建重复事件。
我尝试使用这里描述的方法:
但这只会检查 event/task 名称,这对我不起作用,因为我可能会分配具有相同名称但不同日期等的任务
我的想法是创建一个额外的列,在创建事件后,代码在单元格中写入一个“X”,并且在代码执行时检查这个单元格,如果它已经有一个“ X”,该行将被跳过。但是我正在努力思考如何识别我需要写入的单元格。
基本上,我想遍历指定范围的行,如果“CalendarID”单元格包含一个值,您可以假设创建了一个事件,因此在下一个单元格中,写一个“X ”。剩下的只是一个简单的 if 语句来检查“X”。
My input data
任何人都可以建议如何做到这一点?或者替代策略?
(这是我第一次尝试使用 Apps Script/JS)
非常感谢。
当前代码:
function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var myRange = spreadsheet.getRange("E9:H").getValues();
for (x=0; x<myRange.length;x++)
{
var myRow = myRange[x];
var calendarID = myRow[3];
if(calendarID){
var eventCal = CalendarApp.getCalendarById(calendarID);
var task= myRow[0];
var startTime = myRow[1];
var endTime = myRow[2];
var existingEvents=Calendar.Events.list(calendarID);
var eventArray=[];
existingEvents.items.forEach(function(e){eventArray.push(e.summary)});
if(eventArray.indexOf(task)==-1){
eventCal.createEvent(task, startTime, endTime);
}else{
Logger.log('event exists already');
}
}
}
(我认为)我正在尝试去哪里(查看评论)
function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var myRange = spreadsheet.getRange("E9:H").getValues();
for (x=0; x<myRange.length;x++)
{
var myRow = myRange[x];
var calendarID = myRow[3];
if(calendarID){
//if cell in "Scheduled" column, row x is false
var eventCal = CalendarApp.getCalendarById(calendarID);
var task= myRow[0];
var startTime = myRow[1];
var endTime = myRow[2];
eventCal.createEvent(task, startTime, endTime);
//write "X" in cell in "Scheduled" column, Row x
}
}
}
你的情况,下面的修改怎么样?
修改后的脚本 1:
在此示例脚本中,X
的值被放入“计划”列。
function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var myRange = spreadsheet.getRange("E9:I" + spreadsheet.getLastRow()).getValues();
var rangeList = [];
for (x = 0; x < myRange.length; x++) {
var myRow = myRange[x];
var calendarID = myRow[3];
var scheduled = myRow[4];
if (calendarID && scheduled != "X") {
var eventCal = CalendarApp.getCalendarById(calendarID);
var task = myRow[0];
var startTime = myRow[1];
var endTime = myRow[2];
eventCal.createEvent(task, startTime, endTime);
rangeList.push(`I${x + 9}`)
}
}
if (rangeList.length == 0) return;
spreadsheet.getRangeList(rangeList).setValue("X");
}
- 当此脚本为运行时,当“calendarID”存在且“Scheduled”列没有值“X”时,if 语句中的脚本为运行。在这种情况下,为了放置“X”的值,我使用了RangeList。
修改脚本 2:
在此示例脚本中,事件 ID 的值放在“已安排”列中。
function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var lastRow = spreadsheet.getLastRow();
var myRange = spreadsheet.getRange("E9:I" + lastRow).getValues();
var scheduledAr = [];
for (x = 0; x < myRange.length; x++) {
var myRow = myRange[x];
var calendarID = myRow[3];
var scheduled = myRow[4];
if (calendarID && !scheduled) {
var eventCal = CalendarApp.getCalendarById(calendarID);
var task = myRow[0];
var startTime = myRow[1];
var endTime = myRow[2];
var event = eventCal.createEvent(task, startTime, endTime);
scheduledAr.push([event.getId()]);
} else {
scheduledAr.push([scheduled]); // Modified
}
}
spreadsheet.getRange("I9:I" + lastRow).setValues(scheduledAr);
}
- 当此脚本为运行时,当“calendarID”存在且“Scheduled”列没有值时,if 语句中的脚本为运行。在这种情况下,为了放置事件 ID 的值,我使用了
setValues
.
参考文献:
我正在编写一个脚本,该脚本从 Google 工作表中获取任务列表并自动在 Google 日历上创建事件,将事件放在团队成员的日历上任务已申请。
一切正常,现在我的问题是我希望能够在添加任务时在整个单元格范围内 运行 脚本,而不创建重复事件。
我尝试使用这里描述的方法: 但这只会检查 event/task 名称,这对我不起作用,因为我可能会分配具有相同名称但不同日期等的任务
我的想法是创建一个额外的列,在创建事件后,代码在单元格中写入一个“X”,并且在代码执行时检查这个单元格,如果它已经有一个“ X”,该行将被跳过。但是我正在努力思考如何识别我需要写入的单元格。
基本上,我想遍历指定范围的行,如果“CalendarID”单元格包含一个值,您可以假设创建了一个事件,因此在下一个单元格中,写一个“X ”。剩下的只是一个简单的 if 语句来检查“X”。
My input data
任何人都可以建议如何做到这一点?或者替代策略? (这是我第一次尝试使用 Apps Script/JS)
非常感谢。
当前代码:
function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var myRange = spreadsheet.getRange("E9:H").getValues();
for (x=0; x<myRange.length;x++)
{
var myRow = myRange[x];
var calendarID = myRow[3];
if(calendarID){
var eventCal = CalendarApp.getCalendarById(calendarID);
var task= myRow[0];
var startTime = myRow[1];
var endTime = myRow[2];
var existingEvents=Calendar.Events.list(calendarID);
var eventArray=[];
existingEvents.items.forEach(function(e){eventArray.push(e.summary)});
if(eventArray.indexOf(task)==-1){
eventCal.createEvent(task, startTime, endTime);
}else{
Logger.log('event exists already');
}
}
}
(我认为)我正在尝试去哪里(查看评论)
function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var myRange = spreadsheet.getRange("E9:H").getValues();
for (x=0; x<myRange.length;x++)
{
var myRow = myRange[x];
var calendarID = myRow[3];
if(calendarID){
//if cell in "Scheduled" column, row x is false
var eventCal = CalendarApp.getCalendarById(calendarID);
var task= myRow[0];
var startTime = myRow[1];
var endTime = myRow[2];
eventCal.createEvent(task, startTime, endTime);
//write "X" in cell in "Scheduled" column, Row x
}
}
}
你的情况,下面的修改怎么样?
修改后的脚本 1:
在此示例脚本中,X
的值被放入“计划”列。
function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var myRange = spreadsheet.getRange("E9:I" + spreadsheet.getLastRow()).getValues();
var rangeList = [];
for (x = 0; x < myRange.length; x++) {
var myRow = myRange[x];
var calendarID = myRow[3];
var scheduled = myRow[4];
if (calendarID && scheduled != "X") {
var eventCal = CalendarApp.getCalendarById(calendarID);
var task = myRow[0];
var startTime = myRow[1];
var endTime = myRow[2];
eventCal.createEvent(task, startTime, endTime);
rangeList.push(`I${x + 9}`)
}
}
if (rangeList.length == 0) return;
spreadsheet.getRangeList(rangeList).setValue("X");
}
- 当此脚本为运行时,当“calendarID”存在且“Scheduled”列没有值“X”时,if 语句中的脚本为运行。在这种情况下,为了放置“X”的值,我使用了RangeList。
修改脚本 2:
在此示例脚本中,事件 ID 的值放在“已安排”列中。
function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var lastRow = spreadsheet.getLastRow();
var myRange = spreadsheet.getRange("E9:I" + lastRow).getValues();
var scheduledAr = [];
for (x = 0; x < myRange.length; x++) {
var myRow = myRange[x];
var calendarID = myRow[3];
var scheduled = myRow[4];
if (calendarID && !scheduled) {
var eventCal = CalendarApp.getCalendarById(calendarID);
var task = myRow[0];
var startTime = myRow[1];
var endTime = myRow[2];
var event = eventCal.createEvent(task, startTime, endTime);
scheduledAr.push([event.getId()]);
} else {
scheduledAr.push([scheduled]); // Modified
}
}
spreadsheet.getRange("I9:I" + lastRow).setValues(scheduledAr);
}
- 当此脚本为运行时,当“calendarID”存在且“Scheduled”列没有值时,if 语句中的脚本为运行。在这种情况下,为了放置事件 ID 的值,我使用了
setValues
.