[英]How to run a script on several gmail calendars
我有多名员工将他们的一天输入到护目镜日历中,我获取数据并运行统计数据。 目前我一次只能从一个日历中获取数据。 我怎样才能使用这个脚本并让它在多个日历上工作?
请注意,每个日历都有自己的目标表。 我试过复制脚本,但一次似乎只有一个版本有效。
function export_gcal_to_gsheet() {
var mycal = "person email";
var cal = CalendarApp.getCalendarById(mycal);
var events = cal.getEvents(new Date("July 01, 2022 00:00:00 UTC"), new Date());
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PersonCalendar");
sheet.clearContents();
var calColor = cal.getColor();
var colors = Calendar.Colors.get().calendar;
var header = ["Calendar Address", "Event Title", "Event Description", "Event Location", "Event Start", "Event End", "Calculated Duration", "Visibility", "Date Created", "Last Updated", "MyStatus", "Created By", "All Day Event", "Recurring Event", "Color"];
var offset = 6;
var { v, c } = events.reverse().reduce((o, e, i) => {
var color = e.getColor();
var row = offset + i + 1;
var c = colors[color] ? colors[color].background : calColor;
var f = `=(HOUR(F${row})+(MINUTE(F${row})/60))-(HOUR(E${row})+(MINUTE(E${row})/60))`;
o.v.push([mycal, events[i].getTitle(), events[i].getDescription(), events[i].getLocation(), events[i].getStartTime(), events[i].getEndTime(), f, ('' + events[i].getVisibility()), events[i].getDateCreated(), events[i].getLastUpdated(), events[i].getMyStatus(), events[i].getCreators(), events[i].isAllDayEvent(), events[i].isRecurringEvent(), c]);
o.c.push([c]);
return o;
}, { v: [], c: [] });
var values = [header, ...v];
sheet.getRange(6, 1, values.length, values[0].length).setValues(values);
sheet.getRange(7, 7, v.length - 1).setNumberFormat('.00');
sheet.getRange(7, 15, c.length).setBackgrounds(c);
}
在您的脚本中,只使用了一个日历 ID。 为了使用多个日历ID,当你的展示脚本被修改为使用多个日历ID时,下面的修改怎么样?
在此修改中,所有值都放在“PersonCalendar”表中。
function export_gcal_to_gsheet() {
var calendarIds = ["person email1", "person email2",,,]; // Please set your Calendar IDs.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PersonCalendar");
sheet.clearContents();
var header = ["Calendar Address", "Event Title", "Event Description", "Event Location", "Event Start", "Event End", "Calculated Duration", "Visibility", "Date Created", "Last Updated", "MyStatus", "Created By", "All Day Event", "Recurring Event", "Color"];
var colors = Calendar.Colors.get().calendar;
var { vv, cc } = calendarIds.reduce((oo, mycal) => {
var cal = CalendarApp.getCalendarById(mycal);
var events = cal.getEvents(new Date("July 01, 2022 00:00:00 UTC"), new Date());
var calColor = cal.getColor();
var offset = 6;
var { v, c } = events.reverse().reduce((o, e, i) => {
var color = e.getColor();
var row = offset + i + 1;
var c = colors[color] ? colors[color].background : calColor;
var f = `=(HOUR(F${row})+(MINUTE(F${row})/60))-(HOUR(E${row})+(MINUTE(E${row})/60))`;
o.v.push([mycal, events[i].getTitle(), events[i].getDescription(), events[i].getLocation(), events[i].getStartTime(), events[i].getEndTime(), f, ('' + events[i].getVisibility()), events[i].getDateCreated(), events[i].getLastUpdated(), events[i].getMyStatus(), events[i].getCreators(), events[i].isAllDayEvent(), events[i].isRecurringEvent(), c]);
o.c.push([c]);
return o;
}, { v: [], c: [] });
oo.vv = [...oo.vv, ...v];
oo.cc = [...oo.cc, ...c];
return oo;
}, { vv: [], cc: [] });
var values = [header, ...vv];
sheet.getRange(6, 1, values.length, values[0].length).setValues(values);
sheet.getRange(7, 7, vv.length - 1).setNumberFormat('.00');
sheet.getRange(7, 15, cc.length).setBackgrounds(cc);
}
在此修改中,每个日历的值都放在每个工作表中。
function export_gcal_to_gsheet() {
var obj = [{ mycal: "person email1", sheetName: "PersonCalendar" }];
var colors = Calendar.Colors.get().calendar;
var ss = SpreadsheetApp.getActiveSpreadsheet();
obj.forEach(({ mycal, sheetName }) => {
var cal = CalendarApp.getCalendarById(mycal);
var events = cal.getEvents(new Date("July 01, 2022 00:00:00 UTC"), new Date());
var sheet = ss.getSheetByName(sheetName);
sheet.clear(); // or sheet.clearContents();
var calColor = cal.getColor();
var header = ["Calendar Address", "Event Title", "Event Description", "Event Location", "Event Start", "Event End", "Calculated Duration", "Visibility", "Date Created", "Last Updated", "MyStatus", "Created By", "All Day Event", "Recurring Event", "Color"];
var offset = 6;
var { v, c } = events.reverse().reduce((o, e, i) => {
var color = e.getColor();
var row = offset + i + 1;
var c = colors[color] ? colors[color].background : calColor;
var f = `=(HOUR(F${row})+(MINUTE(F${row})/60))-(HOUR(E${row})+(MINUTE(E${row})/60))`;
o.v.push([mycal, events[i].getTitle(), events[i].getDescription(), events[i].getLocation(), events[i].getStartTime(), events[i].getEndTime(), f, ('' + events[i].getVisibility()), events[i].getDateCreated(), events[i].getLastUpdated(), events[i].getMyStatus(), events[i].getCreators(), events[i].isAllDayEvent(), events[i].isRecurringEvent(), c]);
o.c.push([c]);
return o;
}, { v: [], c: [] });
var values = [header, ...v];
sheet.getRange(6, 1, values.length, values[0].length).setValues(values);
sheet.getRange(7, 7, v.length - 1).setNumberFormat('.00');
sheet.getRange(7, 15, c.length).setBackgrounds(c);
});
}
在此修改中,每个日历的值都放在每个工作表上。 并且,通过使用工作表 API,与“修改脚本 2”相比,工艺成本有所降低。 因此, 请在 Advanced Google services 启用 Sheets API 。
function export_gcal_to_gsheet() {
var obj = [{ mycal: "person email1", sheetName: "PersonCalendar" },,,]; // Please set calendar IDs and sheet names.
var colors = Calendar.Colors.get().calendar;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var { valuesBatchUpdate, batchUpdate } = obj.reduce((oo, { mycal, sheetName }) => {
var cal = CalendarApp.getCalendarById(mycal);
var calColor = cal.getColor();
var events = cal.getEvents(new Date("July 01, 2022 00:00:00 UTC"), new Date());
var header = ["Calendar Address", "Event Title", "Event Description", "Event Location", "Event Start", "Event End", "Calculated Duration", "Visibility", "Date Created", "Last Updated", "MyStatus", "Created By", "All Day Event", "Recurring Event", "Color"];
var offset = 6;
var { v, c } = events.reverse().reduce((o, e, i) => {
var color = e.getColor();
var row = offset + i + 1;
var c = colors[color] ? colors[color].background : calColor;
var f = `=(HOUR(F${row})+(MINUTE(F${row})/60))-(HOUR(E${row})+(MINUTE(E${row})/60))`;
o.v.push([mycal, events[i].getTitle(), events[i].getDescription(), events[i].getLocation(), (events[i].getStartTime().getTime() / 1000 / 86400) + 25569, (events[i].getEndTime().getTime() / 1000 / 86400) + 25569, f, ('' + events[i].getVisibility()), (events[i].getDateCreated().getTime() / 1000 / 86400) + 25569, (events[i].getLastUpdated().getTime() / 1000 / 86400) + 25569, events[i].getMyStatus().toString(), events[i].getCreators().join(","), events[i].isAllDayEvent(), events[i].isRecurringEvent(), c]);
o.c.push([c]);
return o;
}, { v: [], c: [] });
var sheetId = ss.getSheetByName(sheetName).getSheetId();
var hexToRgb = hex => { // Ref: https://stackoverflow.com/a/11508164
var bigint = parseInt(hex, 16);
var red = ((bigint >> 16) & 255) / 255;
var green = ((bigint >> 8) & 255) / 255;
var blue = (bigint & 255) / 255;
return { red, green, blue }
};
oo.valuesBatchUpdate.push({ range: `'${sheetName}'!A6`, values: [header, ...v] });
oo.batchUpdate.push(
{ updateCells: { fields: "*", range: { sheetId } } },
{ repeatCell: { range: { sheetId, startRowIndex: 6, endRowIndex: 6 + v.length, startColumnIndex: 6, endColumnIndex: 7 }, cell: { userEnteredFormat: { numberFormat: { pattern: '.00', type: "NUMBER" } } }, fields: "userEnteredFormat.numberFormat" } },
{ repeatCell: { range: { sheetId, startRowIndex: 6, endRowIndex: 6 + v.length, startColumnIndex: 4, endColumnIndex: 6 }, cell: { userEnteredFormat: { numberFormat: { pattern: 'yyyy/MM/dd', type: "DATE" } } }, fields: "userEnteredFormat.numberFormat" } },
{ repeatCell: { range: { sheetId, startRowIndex: 6, endRowIndex: 6 + v.length, startColumnIndex: 8, endColumnIndex: 10 }, cell: { userEnteredFormat: { numberFormat: { pattern: 'yyyy/MM/dd', type: "DATE" } } }, fields: "userEnteredFormat.numberFormat" } },
{ updateCells: { rows: c.map(([hex]) => ({ values: [{ userEnteredFormat: { backgroundColor: hexToRgb(hex.replace("#", "")) } }] })), range: { sheetId, startRowIndex: 6, endRowIndex: 6 + c.length, startColumnIndex: 14, endColumnIndex: 15 }, fields: "userEnteredFormat.backgroundColor" } }
);
return oo;
}, { valuesBatchUpdate: [], batchUpdate: [] });
var ssId = ss.getId();
Sheets.Spreadsheets.batchUpdate({ requests: batchUpdate }, ssId);
Sheets.Spreadsheets.Values.batchUpdate({ data: valuesBatchUpdate, valueInputOption: "USER_ENTERED" }, ssId);
}
以下两种技术将 output 分发到单独的工作表中,并完整保留大部分原始代码。
function exportcalenders() {
const calids = [{ id: "calid", shnam: "Sheet Name"}];
calids.forEach(obj => {
var cal = CalendarApp.getCalendarById(obj.id);
var events = cal.getEvents(new Date(new Date().getFullYear(),newDate().getMonth(),1),new Date());
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(obj.shnam);
sheet.clearContents();
var calColor = cal.getColor();
var colors = Calendar.Colors.get().calendar;
var header = ["Calendar Address", "Event Title", "Event Description", "Event Location", "Event Start", "Event End", "Calculated Duration", "Visibility", "Date Created", "Last Updated", "MyStatus", "Created By", "All Day Event", "Recurring Event", "Color"];
var offset = 6;
var { v, c } = events.reverse().reduce((o, e, i) => {
var color = e.getColor();
var row = offset + i + 1;
var c = colors[color] ? colors[color].background : calColor;
var f = `=(HOUR(F${row})+(MINUTE(F${row})/60))-(HOUR(E${row})+(MINUTE(E${row})/60))`;
o.v.push([mycal, events[i].getTitle(), events[i].getDescription(), events[i].getLocation(), events[i].getStartTime(), events[i].getEndTime(), f, ('' + events[i].getVisibility()), events[i].getDateCreated(), events[i].getLastUpdated(), events[i].getMyStatus(), events[i].getCreators(), events[i].isAllDayEvent(), events[i].isRecurringEvent(), c]);
o.c.push([c]);
return o;
}, { v: [], c: [] });
var values = [header, ...v];
sheet.getRange(6, 1, values.length, values[0].length).setValues(values);
sheet.getRange(7, 7, v.length - 1).setNumberFormat('.00');
sheet.getRange(7, 15, c.length).setBackgrounds(c);
});
}
这是使用递归的另一种方式:
此版本假定所有日历都与您共享,因此可以通过 getAllCalendars 访问。 inclCals 变量允许您仅包含 getAllCalendars 列表中的某些日历,而 snames 是您希望为每个日历分配两个工作表的列表。 变量 obj 通过 cacheService 将所有这些信息传输到 main cal。
function xportcals() {
let inclCals = ["CalName1", "CalName2", "CalName3", "CalName4"];
let snames = ["Sheet1","Sheet2","Sheet3","Sheet4"]
let obj = CalendarApp.getAllCalendars().reduce((a, c, i) => {
let idx = inclCals.indexOf(c.getName());
if (~idx) {
a["cal"].push({ id: c.getId(), name: c.getName(),sheetname:snames[idx]});
}
return a;
}, { cal: [], proc: { level: 0, som: 1, sod: 1 } });
CacheService.getScriptCache().put("cals", JSON.stringify(obj), 300);
maincals();
}
function maincals() {
let obj = JSON.parse(CacheService.getScriptCache().get("cals"));
var cal = CalendarApp.getCalendarById(obj.cal[obj.proc.level]);
var events = cal.getEvents(new Date(new Date().getFullYear(), newDate().getMonth() - obj.proc.som , obj.proc.sod), new Date());
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(obj.cal.sheetname);
sheet.clearContents();
var calColor = cal.getColor();
var colors = Calendar.Colors.get().calendar;
var header = ["Calendar Address", "Event Title", "Event Description", "Event Location", "Event Start", "Event End", "Calculated Duration", "Visibility", "Date Created", "Last Updated", "MyStatus", "Created By", "All Day Event", "Recurring Event", "Color"];
var offset = 6;
var { v, c } = events.reverse().reduce((o, e, i) => {
var color = e.getColor();
var row = offset + i + 1;
var c = colors[color] ? colors[color].background : calColor;
var f = `=(HOUR(F${row})+(MINUTE(F${row})/60))-(HOUR(E${row})+(MINUTE(E${row})/60))`;
o.v.push([mycal, events[i].getTitle(), events[i].getDescription(), events[i].getLocation(), events[i].getStartTime(), events[i].getEndTime(), f, ('' + events[i].getVisibility()), events[i].getDateCreated(), events[i].getLastUpdated(), events[i].getMyStatus(), events[i].getCreators(), events[i].isAllDayEvent(), events[i].isRecurringEvent(), c]);
o.c.push([c]);
return o;
}, { v: [], c: [] });
var values = [header, ...v];
sheet.getRange(6, 1, values.length, values[0].length).setValues(values);
sheet.getRange(7, 7, v.length - 1).setNumberFormat('.00');
sheet.getRange(7, 15, c.length).setBackgrounds(c);
obj.proc.level += 1;//increment the level counter
CacheService.getScriptCache().put("cals", JSON.stringify(obj), 60);//save obj in cacheService
if (obj.proc.level < obj.cal.length) {
maincals();
}
return;
}
我没有测试这个特定的版本,但我确实测试了一个更简单的版本,并且我测试的大部分不常见的部分都是你的原始代码,它们可能是有效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.