从日历 ID 中拆分 base64 编码的事件 ID 并获取该事件的开始时间?

Splitting a base64 encoded event ID from the calendar ID and getting the start time of that event?

我有以下变量:

var isEventLinkBlank = ssa.getSheetByName("Tracker").getRange(index, 13).isBlank();

它用于检查某个列是否为空,然后我在 if 语句中使用它。 if 语句是完美的,但我想弄清楚 else 语句实际填充该列的情况。

else {
        
ss.toast("New date found and updated!", "Notice", 25);

const viewInvite = sheet.getRange(index, 13).getFormula(); 
// or const viewInvite = '=HYPERLINK("https://www.google.com/calendar/u/0/r/eventedit/';
const getEventId  = viewInvite.substring(viewInvite.lastIndexOf("r/") + 2, viewInvite.lastIndexOf("/"));
Logger.log(getEventId);
      
var timeOfEvent = Utilities.base64Decode(getEventId.split("=")).getStartTime();
isEventLinkBlank = interview_date.setValue(timeOfEvent);
}

填满该列后,会出现一个公式:

=HYPERLINK("https://www.google.com/calendar/u/0/r/eventedit/XXXXXXXXXXXXXXXXX","View Invite")

到目前为止,上面发布的代码应该:

  1. 阅读那个公式
  2. 只得到 XXXXXXXX 部分
  3. 解码 XXXXXXXX 部分(即我解码的事件 ID 和日历 ID
  4. 在解码的内容中将事件 ID 与日历 ID 分开
  5. 利用解码后的事件 ID 获取事件的开始时间(日期)
  6. 最后在interview_date变量(指定列)中设置开始时间的值。

但它显示“未定义”,我已经尝试过多次修改它。

仅供参考,lastIndexOf 解决方案是由用户提供的,但我似乎无法理解为什么写“r/”等等。

谢谢

我相信你的目标如下。

  • 您想从 =HYPERLINK("https://www.google.com/calendar/u/0/r/eventedit/XXXXXXXXXXXXXXXXX","View Invite") 的文本中检索 XXXXXXXXXXXXXXXXX 的值。
  • 您想使用 XXXXXXXXXXXXXXXXX 的检索值检索 Google 日历上事件的开始时间。

修改点:

  • 在您的脚本中,当 =HYPERLINK("https://www.google.com/calendar/u/0/r/eventedit/XXXXXXXXXXXXXXXXX","View Invite") 用于 const getEventId = viewInvite.substring(viewInvite.lastIndexOf("r/") + 2, viewInvite.lastIndexOf("/")); 时,会检索 eventedit 的值。在这种情况下,无法检索 XXXXXXXXXXXXXXXXX。所以一开始需要修改这个脚本
  • Utilities.base64Decode(getEventId.split("=")).getStartTime();Utilities.base64Decode()、returns字节数组。所以.getStartTime()不能用

当以上几点反映到你的脚本中,就会变成下面这样。

修改后的脚本:

从:
const viewInvite = sheet.getRange(index, 13).getFormula(); 
// or const viewInvite = '=HYPERLINK("https://www.google.com/calendar/u/0/r/eventedit/';
const getEventId  = viewInvite.substring(viewInvite.lastIndexOf("r/") + 2, viewInvite.lastIndexOf("/"));
Logger.log(getEventId);
      
var timeOfEvent = Utilities.base64Decode(getEventId.split("=")).getStartTime();
isEventLinkBlank = interview_date.setValue(timeOfEvent);
到:
const viewInvite = sheet.getRange(index, 13).getFormula();  // or const viewInvite = '=HYPERLINK("https://www.google.com/calendar/u/0/r/eventedit/XXXXXXXXXXXXXXXXX","View Invite")'

const getEventId = viewInvite.match(/eventedit\/(\w+)/);
if (getEventId && getEventId.length == 2) {
  const eventId = Utilities.newBlob(Utilities.base64Decode(getEventId[1])).getDataAsString().split(" ");

  const calendarId = "###";  // Please set your calendar ID here.

  const timeOfEvent = CalendarApp.getCalendarById(calendarId).getEventById(eventId[0]).getStartTime();
  Logger.log(eventId[0]);
  
  isEventLinkBlank = interview_date.setValue(timeOfEvent);
}

注:

  • 在这个修改后的脚本中,假设你的interview_date可以用来放值,而viewInvite是像HYPERLINK("https://www.google.com/calendar/u/0/r/eventedit/XXXXXXXXXXXXXXXXX","View Invite")这样的值。请注意这一点。

参考文献: