有没有一种方法可以通过触发器最大限度地减少 google 应用程序脚本的执行时间?
Is there a way where I can minimize execution time of a google apps script through triggers?
所以,让我们这样想:
我有 20 个数据单元,每个单元的处理时间为 1 分钟(总共 20 分钟的处理时间),应用程序脚本函数的最长执行时间为(360 秒),问题是我不想划分他们喜欢手动执行 4 个并行执行,所以我想到了这个:
创建一个驱动程序函数来一次获取 20 个单元 2) 检查
当前触发器。
如果有 < 20 个触发器,将单元除以可用触发器以创建某种并发性(如果触发器 atm 的 n 为 0,则整个执行将在 1 分钟内完成。
如果 >=20(最大限制)睡眠一分钟然后再次检查可用触发器
运行 一个函数,用于在每个触发器完成执行后删除它。
这是可以实现的还是有更好的方法来解决最大执行时间和应用程序脚本中的并发问题?
我相信你的目标如下。
- 您有 20 个单位。
- 在每个单元,您要转换数据。
- 您已经创建了转换数据的脚本。
- 您想使用 Google Apps 脚本实现此目的。
- 您想降低这个过程的成本。
问题和解决方法:
遗憾的是,在当前阶段,还没有直接运行将Google Apps 脚本与异步进程结合使用的方法。因此,为了实现您的目标,需要考虑一种解决方法。在这个答案中,我想提出一个解决方法。此解决方法的流程如下。
- Web 应用程序已部署。
- 您当前用于转换数据的脚本与 Web 应用程序一起使用。
- 为了实现异步过程,使用了 Google Apps 脚本库。 Ref
- 本库使用ClassUrlFetchApp 的fetchAll 方法实现异步处理。 Ref
这样,脚本就可以运行异步处理了。
用法:
1。安装库。
请将库安装到您当前的 Google Apps 脚本项目中。安装方法见here.
2。准备示例脚本。
// This is your current script.
function myFunction(e) {
// do something.
//return result; // Please return the values you want to return.
return e; // This is a sample return value for testing this script.
}
function doPost(e) {
return RunAll.RunFunctionsByDoPost(this, e);
}
// Please run this function.
function main() {
var url = "https://script.google.com/macros/s/###/dev"; // Here, please set the URL of Web Apps.
var token = ScriptApp.getOAuthToken();
var resource = [
{
functionName: "myFunction",
arguments: "sample parameter 1", // Please set the value you want to give.
webAppsURL: url,
accessToken: token,
},
{
functionName: "myFunction",
arguments: "sample parameter 2", // Please set the value you want to give.
webAppsURL: url,
accessToken: token,
},
{
functionName: "myFunction",
arguments: "sample parameter 3", // Please set the value you want to give.
webAppsURL: url,
accessToken: token,
},
];
var res = RunAll.DoWebApps(resource);
res.forEach(function (r) {
Logger.log(r.getContentText());
});
}
- 这是一个示例脚本。当然,您可以使用循环创建
resouece
的值。
3。部署 Web 应用程序
- 在脚本编辑器上,通过“发布”->“部署为网络应用程序”打开一个对话框。
- Select “用户正在访问 Web 应用程序” 或 “我”“将应用程序执行为:”。
- Select “只有我自己” 对于“有权访问该应用程序的人:”。
- 通过此设置,Web 应用程序只能由作为所有者的您访问。如果设置为“Anyone, even anonymous”,则可以访问所有知道 URL Web Apps 的人。所以请小心。
- 单击“部署”按钮作为新的“项目版本”。
- 自动打开“需要授权”的对话框。
- 单击“查看权限”。
- Select自己的账号。
- 点击“此应用未验证”处的“高级”。
- 点击“转到###项目名称###(不安全)”
- 单击“允许”按钮。
- 复制“为您的最新代码测试网络应用”的“最新代码”的 URL。
- 就像
https://script.google.com/macros/s/###/dev
。
- 点击“确定”。
- 这样,即使修改了部署Web Apps的项目中的脚本,也可以自动使用最新的脚本。
- 在此设置中,从同一项目中的脚本访问项目中已部署的 Web 应用程序。
4。测试:
当上面的脚本是运行,当你的设置正确的时候,会得到下面的结果
{"FunctionName":"myFunction","Arguments":"sample parameter 1","Result":"sample parameter 1"}
{"FunctionName":"myFunction","Arguments":"sample parameter 2","Result":"sample parameter 2"}
{"FunctionName":"myFunction","Arguments":"sample parameter 3","Result":"sample parameter 3"}
注:
- 当我测试这个脚本时,工人的最大数量是 29。所以我认为这个解决方法可能适用于您的情况。但我不确定你的实际脚本。所以当这个号码不能用的时候,请修改。
参考文献:
- Benchmark: fetchAll method in UrlFetch service for Google Apps Script
- RunAll
- 这是一个仅使用本机 Google Apps 脚本 (GAS) 运行 并发处理的库。
所以,让我们这样想: 我有 20 个数据单元,每个单元的处理时间为 1 分钟(总共 20 分钟的处理时间),应用程序脚本函数的最长执行时间为(360 秒),问题是我不想划分他们喜欢手动执行 4 个并行执行,所以我想到了这个:
创建一个驱动程序函数来一次获取 20 个单元 2) 检查 当前触发器。
如果有 < 20 个触发器,将单元除以可用触发器以创建某种并发性(如果触发器 atm 的 n 为 0,则整个执行将在 1 分钟内完成。
如果 >=20(最大限制)睡眠一分钟然后再次检查可用触发器
运行 一个函数,用于在每个触发器完成执行后删除它。
这是可以实现的还是有更好的方法来解决最大执行时间和应用程序脚本中的并发问题?
我相信你的目标如下。
- 您有 20 个单位。
- 在每个单元,您要转换数据。
- 您已经创建了转换数据的脚本。
- 您想使用 Google Apps 脚本实现此目的。
- 您想降低这个过程的成本。
问题和解决方法:
遗憾的是,在当前阶段,还没有直接运行将Google Apps 脚本与异步进程结合使用的方法。因此,为了实现您的目标,需要考虑一种解决方法。在这个答案中,我想提出一个解决方法。此解决方法的流程如下。
- Web 应用程序已部署。
- 您当前用于转换数据的脚本与 Web 应用程序一起使用。
- 为了实现异步过程,使用了 Google Apps 脚本库。 Ref
- 本库使用ClassUrlFetchApp 的fetchAll 方法实现异步处理。 Ref
这样,脚本就可以运行异步处理了。
用法:
1。安装库。
请将库安装到您当前的 Google Apps 脚本项目中。安装方法见here.
2。准备示例脚本。
// This is your current script.
function myFunction(e) {
// do something.
//return result; // Please return the values you want to return.
return e; // This is a sample return value for testing this script.
}
function doPost(e) {
return RunAll.RunFunctionsByDoPost(this, e);
}
// Please run this function.
function main() {
var url = "https://script.google.com/macros/s/###/dev"; // Here, please set the URL of Web Apps.
var token = ScriptApp.getOAuthToken();
var resource = [
{
functionName: "myFunction",
arguments: "sample parameter 1", // Please set the value you want to give.
webAppsURL: url,
accessToken: token,
},
{
functionName: "myFunction",
arguments: "sample parameter 2", // Please set the value you want to give.
webAppsURL: url,
accessToken: token,
},
{
functionName: "myFunction",
arguments: "sample parameter 3", // Please set the value you want to give.
webAppsURL: url,
accessToken: token,
},
];
var res = RunAll.DoWebApps(resource);
res.forEach(function (r) {
Logger.log(r.getContentText());
});
}
- 这是一个示例脚本。当然,您可以使用循环创建
resouece
的值。
3。部署 Web 应用程序
- 在脚本编辑器上,通过“发布”->“部署为网络应用程序”打开一个对话框。
- Select “用户正在访问 Web 应用程序” 或 “我”“将应用程序执行为:”。
- Select “只有我自己” 对于“有权访问该应用程序的人:”。
- 通过此设置,Web 应用程序只能由作为所有者的您访问。如果设置为“Anyone, even anonymous”,则可以访问所有知道 URL Web Apps 的人。所以请小心。
- 单击“部署”按钮作为新的“项目版本”。
- 自动打开“需要授权”的对话框。
- 单击“查看权限”。
- Select自己的账号。
- 点击“此应用未验证”处的“高级”。
- 点击“转到###项目名称###(不安全)”
- 单击“允许”按钮。
- 复制“为您的最新代码测试网络应用”的“最新代码”的 URL。
- 就像
https://script.google.com/macros/s/###/dev
。
- 就像
- 点击“确定”。
- 这样,即使修改了部署Web Apps的项目中的脚本,也可以自动使用最新的脚本。
- 在此设置中,从同一项目中的脚本访问项目中已部署的 Web 应用程序。
4。测试:
当上面的脚本是运行,当你的设置正确的时候,会得到下面的结果
{"FunctionName":"myFunction","Arguments":"sample parameter 1","Result":"sample parameter 1"}
{"FunctionName":"myFunction","Arguments":"sample parameter 2","Result":"sample parameter 2"}
{"FunctionName":"myFunction","Arguments":"sample parameter 3","Result":"sample parameter 3"}
注:
- 当我测试这个脚本时,工人的最大数量是 29。所以我认为这个解决方法可能适用于您的情况。但我不确定你的实际脚本。所以当这个号码不能用的时候,请修改。
参考文献:
- Benchmark: fetchAll method in UrlFetch service for Google Apps Script
- RunAll
- 这是一个仅使用本机 Google Apps 脚本 (GAS) 运行 并发处理的库。