从日历 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")
到目前为止,上面发布的代码应该:
- 阅读那个公式
- 只得到 XXXXXXXX 部分
- 解码 XXXXXXXX 部分(即我解码的事件 ID 和日历 ID)
- 在解码的内容中将事件 ID 与日历 ID 分开
- 利用解码后的事件 ID 获取事件的开始时间(日期)
- 最后在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")
这样的值。请注意这一点。
参考文献:
我有以下变量:
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")
到目前为止,上面发布的代码应该:
- 阅读那个公式
- 只得到 XXXXXXXX 部分
- 解码 XXXXXXXX 部分(即我解码的事件 ID 和日历 ID)
- 在解码的内容中将事件 ID 与日历 ID 分开
- 利用解码后的事件 ID 获取事件的开始时间(日期)
- 最后在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")
这样的值。请注意这一点。