我指的是这个问题。
function renameEvents() {
var cal = CalendarApp.getCalendarById("Calendar Id");
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
var sp = PropertiesService.getScriptProperties();
if (!(sp.getProperty("count")) || sp.getProperty("count") == 0) {
var count = 0;
else if ((sp.getProperty("count") > 0) {
var count = sp.getProperty("count");
}
for (var i = count; i < events.length; i++) {
events[i].setTitle(events[i].getTitle() + " something");
events[i].setDescription(events[i].getDescription() + " something else");
sp.setProperty("count", i)
}
}最初的函数运行是时间触发的.如何以编程方式触发下一个函数运行以继续下一个块?
发布于 2020-05-20 05:41:23
我相信你的目标如下。
问题和解决办法:
count启动循环.我是这样理解的。setTitle和setDescription的成本很高。setTitle和setDescription之外,setProperty还在for循环中使用。在这种情况下,过程成本将更高。在我的回答中,作为一种解决办法,我建议在您的情况下使用批处理请求。Calendar API可以由批处理请求运行。批处理请求与异步进程一起运行,可以通过一个API调用运行100个请求。这样可以降低生产成本。因此,我认为当批处理请求用于您的情况时,您的所有任务都可以通过一个正在运行的脚本来完成。
用法:
1.安装Google脚本库。
为了使用此示例脚本,请安装BatchRequest的Google脚本库。您可以在https://github.com/tanaikech/BatchRequest#how-to-install上看到安装库的方法。
2.运行样例脚本。
请复制并粘贴以下脚本。和请在高级谷歌服务上启用谷歌日历API。请将日历ID设置为calendarId。
function myFunction() {
const calendarId = "###";
var cal = CalendarApp.getCalendarById(calendarId);
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
// Create requests for the batch request.
const reqs = events.map(e => ({
method: "PUT",
endpoint: `https://www.googleapis.com/calendar/v3/calendars/${calendarId}/events/${e.getId().replace("@google.com", "")}`,
requestBody: {
start: {dateTime: e.getStartTime().toISOString()},
end: {dateTime: e.getEndTime().toISOString()},
summary: e.getTitle() + " something",
description: e.getDescription() + " something else"
}
}));
// Run batch requests.
const limit = 100;
const split = Math.ceil(reqs.length / limit);
for (let i = 0; i < split; i++) {
BatchRequest.Do({batchPath: "batch/calendar/v3", requests: reqs.splice(0, limit)});
}
}myFunction函数时,所有事件的标题和描述都会被事件的方法修改: Calendar API中的update。注意:
参考文献:
添加:
在此示例脚本中,不使用GAS库。
示例脚本:
function myFunction() {
const calendarId = "###";
var cal = CalendarApp.getCalendarById(calendarId);
var startTime = new Date(1850, 0, 1);
var endTime = new Date(2100, 0, 1);
var events = cal.getEvents(startTime, endTime);
// Create requests for the batch request.
const reqs = events.map(e => ({
method: "PUT",
endpoint: `https://www.googleapis.com/calendar/v3/calendars/${calendarId}/events/${e.getId().replace("@google.com", "")}`,
requestBody: {
start: {dateTime: e.getStartTime().toISOString()},
end: {dateTime: e.getEndTime().toISOString()},
summary: e.getTitle() + " something",
description: e.getDescription() + " something else"
}
}));
// Run batch requests.
const limit = 100;
const split = Math.ceil(reqs.length / limit);
const boundary = "xxxxxxxxxx";
for (let i = 0; i < split; i++) {
const object = {batchPath: "batch/calendar/v3", requests: reqs.splice(0, limit)};
const payload = object.requests.reduce((s, e, i) => s += "Content-Type: application/http\r\nContent-ID: " + i + "\r\n\r\n" + e.method + " " + e.endpoint + "\r\nContent-Type: application/json; charset=utf-8\r\n\r\n" + JSON.stringify(e.requestBody) + "\r\n--" + boundary + "\r\n", "--" + boundary + "\r\n");
const params = {method: "post", contentType: "multipart/mixed; boundary=" + boundary, payload: payload, headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}, muteHttpExceptions: true};
UrlFetchApp.fetch("https://www.googleapis.com/" + object.batchPath, params);
}
}添加:
为了这个,这个修改怎么样?
修改要点:
- Please modify `else if ((sp.getProperty("count") > 0) {` to `} else if (sp.getProperty("count") > 0) {`.
getProperty检索的值是字符串类型。来自nothing happes in 你的回答,我认为这可能是您出现问题的原因。那么下面的修改如何?
修改脚本:
发自:
if (!(sp.getProperty("count")) || sp.getProperty("count") == 0) {
var count = 0;
else if ((sp.getProperty("count") > 0) {
var count = sp.getProperty("count");
}至:
var count = Number(sp.getProperty("count")) || 0;参考资料:
https://stackoverflow.com/questions/61895200
复制相似问题