gpt4 book ai didi

javascript - 使用缓存提高脚本的速度

转载 作者:行者123 更新时间:2023-11-30 12:46:58 24 4
gpt4 key购买 nike

我有一个脚本可以获取电子表格的所有值并使用这些值在日历中创建条目。

但是运行时间过长,超时。

以前不会因为没有足够的条目而需要那么长时间,但现在有足够的条目在超时之前无法完成,所以我需要提高速度。

我认为它运行如此缓慢的原因是因为有一个循环遍历电子表格的每一行,并且在每个循环结束时它会写入一个日历事件。我认为这会增加执行时间,因为它必须一遍又一遍地重新连接到日历。我认为这会大大增加执行时间。

我相信我可以通过缓存来减少这种情况,但我什至不知道它是如何工作的。

这是我的代码:

/**
* Export events from spreadsheet to calendar
*/
function exportEvents() {
var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 1; // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "trhcom7eiadkcn39mg9d0hfceg@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(calId);
for (i in data) {
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
var date = new Date(row[9]);
if (!(isValidDate(date))) continue; // Skip rows without a date
var title = row[19]+" - "+row[3]+" - "+row[1]+" - "+row[2];
var id = row[31];
// Check if event already exists, delete it if it does
try {
var event = cal.getEventSeriesById(id);
event.deleteEventSeries();
row[31] = ''; // Remove event ID
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn't exist
}
var newEvent = cal.createAllDayEvent(title, date).addEmailReminder(4320).addEmailReminder(60).addSmsReminder(4320).addSmsReminder(60).getId();
row[31] = newEvent; // Update the data array with event ID
}
i=0;
for (i in data) {
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
var date = new Date(row[13]);
if (!(isValidDate(date))) continue; // Skip rows without a date
var title = "Expected Pay Date: "+row[19];
var id = row[32];
// Check if event already exists, delete it if it does
try {
var event = cal.getEventSeriesById(id);
event.deleteEventSeries();
row[32] = ''; // Remove event ID
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn't exist
}
date.setDate(date.getDate() + 12);
var newEvent = cal.createAllDayEvent(title, date).addEmailReminder(4320).addEmailReminder(60).addSmsReminder(4320).addSmsReminder(60).getId();
row[32] = newEvent; // Update the data array with event ID
}
// Record all event IDs to spreadsheet
range.setValues(data);
};

我正在尝试使用来自 this page 的信息但我什至不知道从哪里开始。

缓存是存储在本地还是服务器上?我如何访问它?什么是 key ,我在哪里可以找到它?我使用什么网址?这最终将如何提高我的速度?

我觉得这很简单,但我就是不明白这个概念。

更新:经过一些研究后,我不确定缓存是否能帮到我,因为它不是获取需要很长时间的数据,而是创建数据。

也许我应该想办法在循环结束时将所有事件一次简单地写入日历,但我也不知道该怎么做。

最佳答案

你的问题包含很多问题,但你自己已经回答了其中的几个问题......;-) 这确实不是阅读工作表数据的问题(你已经使用 getDataRange().getValues( ) ) 但是事件创建的问题需要很长时间...

不幸的是,没有办法加快它的速度,我们唯一能做的就是减少批处理大小,让脚本每 10 分钟左右自动运行一次,直到创建所有事件。

没有什么很复杂的,这里是一个显示过程的脚本:

function createEvents() {
// check if the script runs for the first time or not,
// if so, create the trigger and PropertiesService.getScriptProperties() the script will use
// a start index to know were from it has to continue

if(PropertiesService.getScriptProperties().getKeys().length==0){
PropertiesService.getScriptProperties().setProperties({'startRow':0 });
ScriptApp.newTrigger('createEvents').timeBased().everyMinutes(10).create();
}
// initialize all variables when we start
var startRow = Number(PropertiesService.getScriptProperties().getProperty('startRow'));

var sheet = SpreadsheetApp.getActiveSheet();
var headerRows = 1; // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getValues();
var calId = "trhcom7eiadkcn39mg9d0hfceg@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(calId);
var counter = 0
for (var i=tstartRow ; i < data.length ; i++) {
counter++ ;
if(counter == 30){ break }
if (i < headerRows) continue; // Skip header row(s)
var row = data[i];
...
... continue your own code
}
// update the spreadsheet
// if i== data.length then kill the trigger and eventually send yourself a message
// to tell you that the script has finished successfully .
// killing the current trigger goes like this :
var trigger = ScriptApp.getProjectTriggers()[0];
ScriptApp.deleteTrigger(trigger);

祝你好运。

关于javascript - 使用缓存提高脚本的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22206851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com