如何为每个 google 应用程序脚本创建一个 link (url) 日历事件
How to create a link (url) to an calendar event per google apps script
目前我尝试创建一个脚本,它在 GSheet 中列出了我所有的日历事件。对于这项工作,我创建了一个 运行 脚本。我想在事件中添加一个带有直接 URL-Link 的附加列。
有谁能帮ans花个脚本例子。在这里您可以找到我的示例 GSheet 文件的 link:https://docs.google.com/spreadsheets/d/1yVQ9JFw2XFftMBJPYWICHNAYvnpwcIleeStiBIiSx0Y/edit?usp=sharing
谢谢
这将在 Sheet0
的当前单元格中创建日历 link
function createCalendarEventLink(id = 'MGk3dHJrMTJiZzBka2hrMnNtdDRhZGZ0YWEgamltZXN0ZWJhbkBqaW1lc3RlYmFuLmNvbQ') {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0');//edit sheet name
const url = `\"https://calendar.google.com/calendar/u/0/r/eventedit/${id}?tab=mc\"`;
const label = '"Calendar Event Link"'
let f = `=HYPERLINK(${url},${label})`;
sh.getCurrentCell().setFormula(f);
}
它不像 Cooper 的解决方案那么顺利。但是帮我解决了eventID的base64编码问题
function calendar() {
var start = new Date(2021,7,8)
var end = new Date(2021,9,9)
var cal = CalendarApp.getCalendarById(Session.getActiveUser().getEmail()).getEvents(start, end)
for (var i = 0; i <= cal.length; i++){
var eventID = cal[i].getId()
var eventIDshort = eventID.substr(0, eventID.length - 11)
var calID = String(cal[i].getOriginalCalendarId()).substr(0,cal[i].getOriginalCalendarId().length - 9)
var str = eventIDshort + " " + calID + "m"
var encode = Utilities.base64Encode(str)
var link = "https://calendar.google.com/calendar/u/0/r/eventedit/" + encode //This is the Link you want
}
}
这是@Vetx 答案的另一种变体,其中包括事件 ID 和日历 ID 的编码并使用不同的基数 url(我通过将数据写入 sheet 一次来优化您当前的代码)
示例代码:
function myStart() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("MyCalendar");
var myEMail = Session.getActiveUser().getEmail();
sheet.clear();
var data = [["Start","End","Headline","I am the owner","Creator","URL"]]
sheet.setColumnWidth(1, 100);
sheet.setColumnWidth(2, 100);
sheet.setColumnWidth(3, 300);
sheet.setColumnWidth(4, 150);
sheet.setColumnWidth(5, 250);
var myCal = CalendarApp.getCalendarById(myEMail).getEvents(new Date(1900,1,1), new Date(2100,1,1));
for (var i=0;i<myCal.length;i++) {
var txt = myCal[i].getCreators();
if (myEMail == txt) {
var eventID = myCal[i].getId();
// Remove succeeding characters after @
eventID = eventID.substr(0, eventID.indexOf("@"));
// Combine event id and calendar id (with space in between)
var str = eventID + " " + myEMail;
var encode = Utilities.base64Encode(str).replace("=","");
var link = "https://www.google.com/calendar/event?eid=" + encode
var tmpData = [
myCal[i].getStartTime(),
myCal[i].getEndTime(),
myCal[i].getTitle(),
myCal[i].isOwnedByMe(),
myCal[i].getCreators(),
link
];
data.push(tmpData);
}
}
sheet.getRange(1,1,data.length,data[0].length).setValues(data);
}
它有什么作用?
- 在
data
变量中添加 header 行值
- 根据给定的日历 ID、开始和结束日期获取所有事件
- 解析事件ID(删除@后的尾随字符)并将其与日历ID组合。对字符串进行编码并将其附加到基数 url
https://www.google.com/calendar/event?eid=
- 将处理的每个事件推送到
data
变量
- 将数据写入sheet
输出:
目前我尝试创建一个脚本,它在 GSheet 中列出了我所有的日历事件。对于这项工作,我创建了一个 运行 脚本。我想在事件中添加一个带有直接 URL-Link 的附加列。
有谁能帮ans花个脚本例子。在这里您可以找到我的示例 GSheet 文件的 link:https://docs.google.com/spreadsheets/d/1yVQ9JFw2XFftMBJPYWICHNAYvnpwcIleeStiBIiSx0Y/edit?usp=sharing
谢谢
这将在 Sheet0
的当前单元格中创建日历 linkfunction createCalendarEventLink(id = 'MGk3dHJrMTJiZzBka2hrMnNtdDRhZGZ0YWEgamltZXN0ZWJhbkBqaW1lc3RlYmFuLmNvbQ') {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0');//edit sheet name
const url = `\"https://calendar.google.com/calendar/u/0/r/eventedit/${id}?tab=mc\"`;
const label = '"Calendar Event Link"'
let f = `=HYPERLINK(${url},${label})`;
sh.getCurrentCell().setFormula(f);
}
它不像 Cooper 的解决方案那么顺利。但是帮我解决了eventID的base64编码问题
function calendar() {
var start = new Date(2021,7,8)
var end = new Date(2021,9,9)
var cal = CalendarApp.getCalendarById(Session.getActiveUser().getEmail()).getEvents(start, end)
for (var i = 0; i <= cal.length; i++){
var eventID = cal[i].getId()
var eventIDshort = eventID.substr(0, eventID.length - 11)
var calID = String(cal[i].getOriginalCalendarId()).substr(0,cal[i].getOriginalCalendarId().length - 9)
var str = eventIDshort + " " + calID + "m"
var encode = Utilities.base64Encode(str)
var link = "https://calendar.google.com/calendar/u/0/r/eventedit/" + encode //This is the Link you want
}
}
这是@Vetx 答案的另一种变体,其中包括事件 ID 和日历 ID 的编码并使用不同的基数 url(我通过将数据写入 sheet 一次来优化您当前的代码)
示例代码:
function myStart() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("MyCalendar");
var myEMail = Session.getActiveUser().getEmail();
sheet.clear();
var data = [["Start","End","Headline","I am the owner","Creator","URL"]]
sheet.setColumnWidth(1, 100);
sheet.setColumnWidth(2, 100);
sheet.setColumnWidth(3, 300);
sheet.setColumnWidth(4, 150);
sheet.setColumnWidth(5, 250);
var myCal = CalendarApp.getCalendarById(myEMail).getEvents(new Date(1900,1,1), new Date(2100,1,1));
for (var i=0;i<myCal.length;i++) {
var txt = myCal[i].getCreators();
if (myEMail == txt) {
var eventID = myCal[i].getId();
// Remove succeeding characters after @
eventID = eventID.substr(0, eventID.indexOf("@"));
// Combine event id and calendar id (with space in between)
var str = eventID + " " + myEMail;
var encode = Utilities.base64Encode(str).replace("=","");
var link = "https://www.google.com/calendar/event?eid=" + encode
var tmpData = [
myCal[i].getStartTime(),
myCal[i].getEndTime(),
myCal[i].getTitle(),
myCal[i].isOwnedByMe(),
myCal[i].getCreators(),
link
];
data.push(tmpData);
}
}
sheet.getRange(1,1,data.length,data[0].length).setValues(data);
}
它有什么作用?
- 在
data
变量中添加 header 行值 - 根据给定的日历 ID、开始和结束日期获取所有事件
- 解析事件ID(删除@后的尾随字符)并将其与日历ID组合。对字符串进行编码并将其附加到基数 url
https://www.google.com/calendar/event?eid=
- 将处理的每个事件推送到
data
变量 - 将数据写入sheet