Auto-create google 工作簿中多个工作表的日历事件使用触发器且不创建重复事件
Auto-create google calendar events from multiple sheets in a workbook using a trigger and without creating duplicate events
我在这里一无所知,所以非常感谢任何帮助。我的应用程序脚本代码很草率,是从在线示例中拼凑而成的。我知道这是垃圾,不能满足我的大部分需求。这就是我来这里的原因。我的目标是 auto-populate google 来自工作簿中多个 sheet 的日历事件并创建触发器,以便在任何时候在这些单元格中编辑内容时填充新事件(或编辑事件)但不会创建重复事件。
我将从中提取数据的单元格对于每个 sheet 都是相同的:
C4:C24(这些单元格包含事件的标题)和
E4:F24(这些单元格分别包含开始日期和时间以及结束日期和时间)。
我设置的触发器处于编辑状态,但是当我进行编辑时,每次都会创建重复的事件,这是我不想要的。
非常感谢任何帮助。谢谢!
// function to retrieve data from Sheet and add to Calendar
function simpleSheetsToCalendar() {
// get spreadsheet
var spreadsheet = SpreadsheetApp.getActiveSheet();
var eventCal =
CalendarApp.getCalendarById('actualCalendarId');
var signups = spreadsheet.getRange("C4:F24").getValues();
for (x=0; x<signups.length;x++)
{
var shift = signups[x];
var task= shift[0];
var startTime = shift[2];
var endTime = shift[3];
eventCal.createEvent(task, startTime, endTime);} }
我相信你的目标如下。
- 您想从 Google 电子表格的多个工作表中的单元格“C4:F24”中检索值。
- “C”、“E”、“F”列分别是事件标题、开始时间和结束时间。
- 您想使用检索到的值在 Google 日历中创建一个新事件。那时,您不想创建重复的事件标题。
示例脚本:
在此示例脚本中,为了检索日历事件的所有标题,使用了日历 API。所以在你使用这个脚本之前,please enable Calendar API at Advanced Google services。并且,请设置 sheetNames
和 calendarId
。
function simpleSheetsToCalendar() {
var sheetNames = ["Sheet1", "Sheet3",,,]; // Please set the sheet names you want to use.
var calendarId = "###"; // Please set your calendar ID.
// 1. Retrieve all events from the Calendar and create an object for checking the duplicated titles.
var events = [];
var pageToken = "";
do {
var res = Calendar.Events.list(calendarId, {maxResults: 2500, fields: "nextPageToken,items(summary)", pageToken});
events = events.concat(res.items);
pageToken = res.nextPageToken;
} while(pageToken);
var obj = events.reduce((o, e) => Object.assign(o, {[e.summary]: true}), {});
// 2. Retrieve sheets from a Google Spreadsheet and retrieve the values from "C4:F24", and create an object for creating new events.
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var values = spreadsheet.getSheets().reduce((o, sheet) => {
if (!sheetNames.includes(sheet.getSheetName())) return o;
var signups = sheet.getRange("C4:F24").getValues();
signups.forEach(([title,,startTime,endTime]) => {
if (!obj[title] && title && startTime && endTime && !o[title]) o[title] = {startTime,endTime};
});
return o;
}, {});
// 3. Create new events.
var ar = Object.entries(values);
if (ar.length == 0) return;
var eventCal = CalendarApp.getCalendarById(calendarId);
ar.forEach(([title, {startTime, endTime}]) => eventCal.createEvent(title, startTime, endTime));
}
- 当此脚本为 运行 时,将检索日历中的所有事件标题,并从 Google 电子表格中多个工作表上的“C4:F24”检索值。然后,通过检查重复的标题创建新事件。
注:
- 在此示例脚本中,检查事件标题以检查重复的事件。如果要查看其他属性,请修改上面的示例脚本。
参考文献:
我在这里一无所知,所以非常感谢任何帮助。我的应用程序脚本代码很草率,是从在线示例中拼凑而成的。我知道这是垃圾,不能满足我的大部分需求。这就是我来这里的原因。我的目标是 auto-populate google 来自工作簿中多个 sheet 的日历事件并创建触发器,以便在任何时候在这些单元格中编辑内容时填充新事件(或编辑事件)但不会创建重复事件。
我将从中提取数据的单元格对于每个 sheet 都是相同的: C4:C24(这些单元格包含事件的标题)和 E4:F24(这些单元格分别包含开始日期和时间以及结束日期和时间)。
我设置的触发器处于编辑状态,但是当我进行编辑时,每次都会创建重复的事件,这是我不想要的。
非常感谢任何帮助。谢谢!
// function to retrieve data from Sheet and add to Calendar
function simpleSheetsToCalendar() {
// get spreadsheet
var spreadsheet = SpreadsheetApp.getActiveSheet();
var eventCal =
CalendarApp.getCalendarById('actualCalendarId');
var signups = spreadsheet.getRange("C4:F24").getValues();
for (x=0; x<signups.length;x++)
{
var shift = signups[x];
var task= shift[0];
var startTime = shift[2];
var endTime = shift[3];
eventCal.createEvent(task, startTime, endTime);} }
我相信你的目标如下。
- 您想从 Google 电子表格的多个工作表中的单元格“C4:F24”中检索值。
- “C”、“E”、“F”列分别是事件标题、开始时间和结束时间。
- 您想使用检索到的值在 Google 日历中创建一个新事件。那时,您不想创建重复的事件标题。
示例脚本:
在此示例脚本中,为了检索日历事件的所有标题,使用了日历 API。所以在你使用这个脚本之前,please enable Calendar API at Advanced Google services。并且,请设置 sheetNames
和 calendarId
。
function simpleSheetsToCalendar() {
var sheetNames = ["Sheet1", "Sheet3",,,]; // Please set the sheet names you want to use.
var calendarId = "###"; // Please set your calendar ID.
// 1. Retrieve all events from the Calendar and create an object for checking the duplicated titles.
var events = [];
var pageToken = "";
do {
var res = Calendar.Events.list(calendarId, {maxResults: 2500, fields: "nextPageToken,items(summary)", pageToken});
events = events.concat(res.items);
pageToken = res.nextPageToken;
} while(pageToken);
var obj = events.reduce((o, e) => Object.assign(o, {[e.summary]: true}), {});
// 2. Retrieve sheets from a Google Spreadsheet and retrieve the values from "C4:F24", and create an object for creating new events.
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var values = spreadsheet.getSheets().reduce((o, sheet) => {
if (!sheetNames.includes(sheet.getSheetName())) return o;
var signups = sheet.getRange("C4:F24").getValues();
signups.forEach(([title,,startTime,endTime]) => {
if (!obj[title] && title && startTime && endTime && !o[title]) o[title] = {startTime,endTime};
});
return o;
}, {});
// 3. Create new events.
var ar = Object.entries(values);
if (ar.length == 0) return;
var eventCal = CalendarApp.getCalendarById(calendarId);
ar.forEach(([title, {startTime, endTime}]) => eventCal.createEvent(title, startTime, endTime));
}
- 当此脚本为 运行 时,将检索日历中的所有事件标题,并从 Google 电子表格中多个工作表上的“C4:F24”检索值。然后,通过检查重复的标题创建新事件。
注:
- 在此示例脚本中,检查事件标题以检查重复的事件。如果要查看其他属性,请修改上面的示例脚本。