如何为每个 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);
}

它有什么作用?

  1. data 变量中添加 header 行值
  2. 根据给定的日历 ID、开始和结束日期获取所有事件
  3. 解析事件ID(删除@后的尾随字符)并将其与日历ID组合。对字符串进行编码并将其附加到基数 url https://www.google.com/calendar/event?eid=
  4. 将处理的每个事件推送到 data 变量
  5. 将数据写入sheet

输出: