getdata() 脚本仅在时间触发时超时

2024-02-07

我正在从另一个电子表格导入一个范围,并使用以下脚本将其粘贴到当前电子表格中:

function getdata() { 
var values = SpreadsheetApp.openById('XXXXXX').
getSheetByName('SheetB').getRange('A4:AZ484').getValues();
var destsheet = SpreadsheetApp.getActive().getSheetByName('Sheet1'); 
var destrange = destsheet.getRange('B520:BA1000'); 
destrange.setValues(values);
}

手动触发脚本时,执行持续大约 20 秒,并且完全没有问题:

[19-09-06 23:34:48:847 PDT] Starting execution
[19-09-06 23:34:48:999 PDT] SpreadsheetApp.openById([XXXXXX]) [0.145 seconds]
[19-09-06 23:34:49:000 PDT] Spreadsheet.getSheetByName([SheetB]) [0 seconds]
[19-09-06 23:34:49:000 PDT] Sheet.getRange([A4:AZ484]) [0 seconds]
[19-09-06 23:35:07:353 PDT] Range.getValues() [18.352 seconds]
[19-09-06 23:35:07:361 PDT] SpreadsheetApp.getActive() [0 seconds]
[19-09-06 23:35:07:510 PDT] Spreadsheet.getSheetByName([Sheet1]) [0.148 seconds]
[19-09-06 23:35:07:511 PDT] Sheet.getRange([B520:BA1000]) [0 seconds]
[19-09-06 23:35:09:907 PDT] Range.setValues([[[Tue Jan 01 00:00:00 GMT+01:00 2019, 235.1840336134454, 9.0, 41.525999999999996, 10.0, 21.0, 13.0, 13.0, 8.0, 59.43, 0.0, 0.0, 0.0, 0.0, 166.36, 0.0, 269.14, 8.0, 33.6425, 246.7, 1.0909606809890555,...) [2.374 seconds]
[19-09-06 23:35:10:571 PDT] Execution succeeded [21.055 seconds total runtime]

但是,当时间驱动触发时(该脚本应每天自动运行一次),执行时间将达到 374.518 秒并超时。

编辑----->我一直在分割脚本并记录它:

function getdata() { 
var ss = SpreadsheetApp.openById('XXXXX');console.log('s1');
  var sh =ss.getSheetByName('SheetB');console.log('s2');
  var si = sh.getRange('A4:AZ484');console.log('s3');
  var sj = si.getValues(); console.log('step1')
  var destsheet = SpreadsheetApp.getActive().getSheetByName('Sheet1'); console.log('step2')
  var destrange = destsheet.getRange('B520:BA1000'); console.log('step3')
  destrange.setValues(sj); console.log('step4')
}

显然它陷入了“var sj = si.getValues(); console.log('step1')”。

整个范围约为 25.000 个单元,我认为这应该不会太多。

任何人都知道这是怎么发生的?

非常感谢您的帮助!


TL;DR 解决此问题的最快方法是 UPDATE II。

原答案:getValues https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues & setValues https://developers.google.com/apps-script/reference/spreadsheet/range#setvaluesvalues

我们尝试通过创建一个比您的电子表格大六倍的电子表格(总共 150,000 个单元格)来重现此错误。然后我们运行一个函数,使用您的方法将其复制到空白电子表格。经过多次运行后,我们平均需要 43 秒才能完成。这正是我们用来复制您的操作的函数:

function copySheet(){
  var ss1 = SpreadsheetApp.openById('{ORIGINAL SPREADSHEET}').getSheetByName('Sheet1');
  var ss2 = SpreadsheetApp.openById('{COPY SPREADSHEET}').getSheetByName('Sheet1');
  var originalData = ss1.getRange(1, 1, 75000, 2).getValues();
  var targetRange = ss2.getRange(1, 1, 75000, 2).setValues(originalData);
}

这是真实执行记录的示例:

[19-09-09 04:09:27:021 PDT] Starting execution
[19-09-09 04:09:27:122 PDT] SpreadsheetApp.openById([{ORIGINAL SPREADSHEET}]) [0.093 seconds]
[19-09-09 04:09:27:123 PDT] Spreadsheet.getSheetByName([Sheet1]) [0 seconds]
[19-09-09 04:09:27:211 PDT] SpreadsheetApp.openById([{COPY SPREADSHEET}]) [0.086 seconds]
[19-09-09 04:09:27:211 PDT] Spreadsheet.getSheetByName([Sheet1]) [0 seconds]
[19-09-09 04:09:27:212 PDT] Sheet.getRange([1, 1, 75000, 2]) [0 seconds]
[19-09-09 04:09:50:166 PDT] Range.getValues() [22.953 seconds]
[19-09-09 04:09:50:396 PDT] Sheet.getRange([1, 1, 75000, 2]) [0.001 seconds]
[19-09-09 04:10:06:199 PDT] Range.setValues() [15.59 seconds]
[19-09-09 04:10:07:128 PDT] Execution succeeded [39.172 seconds total runtime]

当我们使用触发器运行此函数时,我们得到了相似的时间值。有了所有这些信息,我们可以推断范围的大小不是问题。由于您的功能停止工作getValues()行,正如您所说,这是一个包含大量信息并链接到多个源的电子表格,我们建议在零链接的复制电子表格中重复此操作,以解决该问题。或者,您可以向我们提供匿名电子表格来测试它。我们希望这对您有用。请随时向我们提供更多信息以获得进一步帮助。

更新一:copyTo https://developers.google.com/apps-script/reference/spreadsheet/range#copytodestination-options, getValues https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues & setValues https://developers.google.com/apps-script/reference/spreadsheet/range#setvaluesvalues

要仅复制数据本身(也不复制链接或公式),我们可以使用该方法copyTo具有以下参数。不幸的是,该方法只能用于复制同一电子表格内的数据。作为解决方法,以下代码将在原始电子表格内创建一个新工作表,稍后仅将数据复制到该新工作表,然后将该工作表复制到目标电子表格。最后,中间表将被删除。

function copySheet2() {
  var ss1 = SpreadsheetApp.openById('{ORIGINAL SPREADSHEET}');
  var copySheet = ss1.insertSheet('Clone');
  var ss2 = SpreadsheetApp.openById('{COPY SPREADSHEET}').getSheetByName('Sheet1');
  var originalData = ss1.getSheetByName('Sheet1').getRange(1, 1, 75000, 2);
  var destinationRange = ss1.getSheetByName('Clone').getRange(1, 1, 75000, 2);
  originalData.copyTo(destinationRange, {
    contentsOnly: "true"
  });
  var cloneData = ss1.getSheetByName('Clone').getRange(1, 1, 75000, 2).getValues();
  var destinationSpreadsheet = ss2.getRange(1, 1, 75000, 2).setValues(cloneData);
  ss1.deleteSheet(ss1.getSheetByName('Clone'));
}

正如我们在新的执行记录中看到的,通过这种方法,我们可以大大减少执行时间。

[19-09-11 10:11:50:333 CEST] Starting execution
[19-09-11 10:11:50:391 CEST] SpreadsheetApp.openById([{ORIGINAL SPREADSHEET}]) [0.052 seconds]
[19-09-11 10:11:52:132 CEST] Spreadsheet.insertSheet([Clone]) [1.741 seconds]
[19-09-11 10:11:54:012 CEST] SpreadsheetApp.openById([{COPY SPREADSHEET}]) [1.879 seconds]
[19-09-11 10:11:54:012 CEST] Spreadsheet.getSheetByName([Sheet1]) [0 seconds]
[19-09-11 10:11:57:376 CEST] Spreadsheet.getSheetByName([Sheet1]) [3.364 seconds]
[19-09-11 10:11:57:377 CEST] Sheet.getRange([1, 1, 75000, 2]) [0 seconds]
[19-09-11 10:11:57:377 CEST] Spreadsheet.getSheetByName([Clone]) [0 seconds]
[19-09-11 10:11:57:378 CEST] Sheet.getRange([1, 1, 75000, 2]) [0 seconds]
[19-09-11 10:11:57:378 CEST] Range.copyTo([Range, {contentsOnly=true}]) [0 seconds]
[19-09-11 10:11:57:379 CEST] Spreadsheet.getSheetByName([Clone]) [0 seconds]
[19-09-11 10:11:57:379 CEST] Sheet.getRange([1, 1, 75000, 2]) [0 seconds]
[19-09-11 10:12:04:314 CEST] Range.getValues() [6.934 seconds]
[19-09-11 10:12:04:445 CEST] Sheet.getRange([1, 1, 75000, 2]) [0 seconds]
[19-09-11 10:12:16:389 CEST] Range.setValues() [11.798 seconds]
[19-09-11 10:12:16:390 CEST] Spreadsheet.getSheetByName([Clone]) [0 seconds]
[19-09-11 10:12:16:950 CEST] Spreadsheet.deleteSheet([Sheet]) [0.56 seconds]
[19-09-11 10:12:18:021 CEST] Execution succeeded [26.613 seconds total runtime]

我们希望这个新程序对您有用,但如果您需要,请随时寻求更多帮助。

更新二:copyTo https://developers.google.com/apps-script/reference/spreadsheet/range#copytodestination-options

为了改进之前的代码,我实现了该方法copyTo由于其更高的性能。此新代码将开始复制范围并删除同一电子表格中的公式(与第一次更新一样)。稍后它将将该克隆表中的数据复制到目标电子表格。最后,它将值从导入的克隆工作表复制到主工作表。我添加了最后一个功能,因为我假设您希望在目标电子表格中移动数据。

function copySheet3() {
  var ss1 = SpreadsheetApp.openById('{ORIGINAL SPREADSHEET}');
  var ss2 = SpreadsheetApp.openById('{COPY SPREADSHEET}');
  ss1.insertSheet('Clone');
  var cloneSheet = ss1.getSheetByName('Clone');
  var dataRange = ss1.getSheetByName('Sheet1').getRange(1, 1, 75000, 2);
  var destinationRange = ss1.getSheetByName('Clone').getRange(1, 1, 75000, 2);
  dataRange.copyTo(destinationRange, {
    contentsOnly: "true"
  });
  cloneSheet.copyTo(ss2);
  ss1.deleteSheet(cloneSheet);
  var cloneSheet = ss2.getSheetByName(
  'Copy of Clone'); // Clone on the destination
  var tempRange = cloneSheet.getRange(1, 1, 75000, 2);
  var finalRange = ss2.getSheetByName('Sheet1').getRange(1, 1, 75000, 2);
  tempRange.copyTo(finalRange, {
    contentsOnly: "true"
  });
  ss2.deleteSheet(cloneSheet);
}

正如我们在执行记录中看到的那样,这种方法比以前的选项更能缩短运行时间:

[19-09-16 10:24:04:036 CEST] Starting execution
[19-09-16 10:24:04:113 CEST] SpreadsheetApp.openById([{ORIGINAL SPREADSHEET}]) [0.071 seconds]
[19-09-16 10:24:04:444 CEST] SpreadsheetApp.openById([{COPY SPREADSHEET}]) [0.33 seconds]
[19-09-16 10:24:06:150 CEST] Spreadsheet.insertSheet([Clone]) [1.705 seconds]
[19-09-16 10:24:06:525 CEST] Spreadsheet.getSheetByName([Clone]) [0.374 seconds]
[19-09-16 10:24:06:525 CEST] Spreadsheet.getSheetByName([Sheet1]) [0 seconds]
[19-09-16 10:24:06:526 CEST] Sheet.getRange([1, 1, 75000, 2]) [0 seconds]
[19-09-16 10:24:06:527 CEST] Spreadsheet.getSheetByName([Clone]) [0 seconds]
[19-09-16 10:24:06:528 CEST] Sheet.getRange([1, 1, 75000, 2]) [0 seconds]
[19-09-16 10:24:06:528 CEST] Range.copyTo([Range, {contentsOnly=true}]) [0 seconds]
[19-09-16 10:24:12:755 CEST] Sheet.copyTo([Spreadsheet]) [6.226 seconds]
[19-09-16 10:24:13:271 CEST] Spreadsheet.deleteSheet([Sheet]) [0.515 seconds]
[19-09-16 10:24:13:272 CEST] Spreadsheet.getSheetByName([Copy of Clone]) [0 seconds]
[19-09-16 10:24:13:273 CEST] Sheet.getRange([1, 1, 75000, 2]) [0 seconds]
[19-09-16 10:24:13:273 CEST] Spreadsheet.getSheetByName([Sheet1]) [0 seconds]
[19-09-16 10:24:13:274 CEST] Sheet.getRange([1, 1, 75000, 2]) [0 seconds]
[19-09-16 10:24:13:275 CEST] Range.copyTo([Range, {contentsOnly=true}]) [0 seconds]
[19-09-16 10:24:15:594 CEST] Spreadsheet.deleteSheet([Sheet]) [2.319 seconds]
[19-09-16 10:24:15:767 CEST] Execution succeeded [11.553 seconds total runtime]

请让我们所有人知道这个新代码示例是否对您的项目有帮助。请随意添加更多想法或分享执行记录以进行更多开发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getdata() 脚本仅在时间触发时超时 的相关文章

  • 加快 SpriteSheet 的 UIImage 创建速度

    我不确定我的标题是否正确 但我不确定我的问题到底在哪里 我需要从 spritesheet 加载 UIImage 数组 然后将其用作 UIImageView 中的动画 spritesheet是用TexturePacker生成的 它生成巨大的图
  • 在Python中将大文件(25k条目)加载到dict中很慢?

    我有一个大约有 25000 行的文件 它是 s19 格式的文件 每行就像 S214780010 00802000000010000000000A508CC78C 像这样的事情怎么样 我做了一个测试文件 只有一行S21478001000802
  • 为什么 LinkedList 通常比 List 慢?

    我开始在我的一些 C 算法中使用一些 LinkedList 而不是列表 希望能够加快速度 然而 我注意到他们只是感觉更慢 像任何优秀的开发人员一样 我认为我应该尽职调查并验证我的感受 所以我决定对一些简单的循环进行基准测试 我认为用一些随机
  • 将数据添加到闪存中的段如何会扰乱程序的时序?

    我有一个实时嵌入式应用程序 其主周期以 10KHz 运行 它在配置为从闪存启动的 TI TMS320C 上运行 我最近在源文件中添加了一个初始化的数组 突然间时间就搞砸了 以一种太复杂的方式无法很好地解释 本质上串行端口写入不再按时完成 这
  • 如何以最佳方式计算 python 列表中的元素数量

    这几乎是同一个问题here https stackoverflow com questions 3710976 counting unique elements in a list 除了我要询问排序结果的最有效解决方案 我有一个列表 大约
  • 使用 Google Apps 脚本从 Firebase 读取数据

    因此 正如标题所示 我目前正在解决一个相当麻烦的问题 这是场景 我有一个 Google 电子表格 其中包含一个包含姓名 电子邮件和到期日期的模板 但是 它不包含实际数据 数据本身位于 Firebase 中并且不断变化 那么 我的目标是让sc
  • 简单的Java程序插入USB热点后速度慢100倍

    我有以下Java程序 class Main public static void main String args throws java io IOException long start System nanoTime java io
  • Mysql使用触发器建表

    我尝试在 Mysql 触发器内创建表 但没有创建 如何使用触发器创建表 这里传递的表的名称是动态的 据我所知 在触发器内创建表是不可能的 看这里 http forums mysql com read php 99 121849 122609
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • 每组最大 n 个 SQL 查询的高性能方法

    我正在尝试构建一个基础设施 以便根据需要快速运行回归 从包含我们网络服务器上所有历史活动的数据库中提取 apache 请求 为了通过确保我们仍然回归来自较小客户的请求来提高覆盖范围 我想通过为每个客户检索最多 n 个 为了这个问题 假设 1
  • 用于提交、评分和发回 Google 课堂作业的 Google Apps 脚本

    正如下面的评论中提到的 如果只有学生可以交一些东西 那么我就需要能够评分并返回作业 即使它还没有上交 澄清一下 作业是通过 API 完成的 我可以控制班级和学生 正如下面的附加评论中提到的 即使您不返回作业 学生仍然会看到分配的成绩 这实现
  • 最大化数组中成对距离的总和

    想象一个清单 e1 e2 en 和一个函数f e1 e2 gt number返回常数时间内任意两个元素之间的距离 f e e 0 e1 e2 gt f e1 e2 gt 0 f e1 e2 lt f e1 e3 f e3 e2 目标是排列列
  • 为什么电子邮件正文给出不同的输出?

    我正在尝试触发来自 Google 应用程序脚本的电子邮件 const body HtmlService createHtmlOutput A b new task b have been added to the Task Manager
  • 生成多列范围的所有唯一值的列表,并根据这些值在最后 X 列中出现的次数对这些值进行评级

    正如标题所说 我有一个这样的范围 A B C duck fish dog rat duck cat dog bear bear 我想要的是获取范围内所有唯一值的单列列表 并根据它们在最后 X 列中出现的次数为它们分配评级 或等级 更多列不断
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • Google Apps 脚本自动生成的库文档

    我目前正在开发一个 Google Apps 脚本库 它基本上将电子表格视为数据库对象 目前 该库有两个相同的功能 例如 Opens and creates a query object for a spreadsheet with the
  • 计算列表的累积和,直到出现零

    我有一个 长 列表 其中随机出现零和一 list a 1 1 1 0 1 1 0 1 0 1 1 1 我想获取 list b 列表中出现 0 之前的总和 出现0的地方 在列表中保留0 list b 1 2 3 0 1 2 0 1 0 1 2
  • 如何从 HTML 文件输入获取文件并将其作为 Google Apps 脚本中电子邮件的附件发送?

    此 HTML 代码使用 Google Script 的 HTML 类服务获取文件输入 见下文 我想获取输入字段的值 文件 发送到我的 gs 文件并将其作为电子邮件的附件发送 从输入字段获取值只会返回文件的目录 这没有任何帮助 因为 Goog
  • 为什么 foreach 这么慢?

    PHPBench com http www phpbench com 在每个页面加载上运行快速基准测试脚本 在 foreach 测试中 当我加载它时 foreach 的运行时间是第三个示例的 4 到 10 倍 为什么本机语言构造明显比执行逻
  • 带触发器的物化视图?

    我可以在物化视图上创建触发器吗 我用的是甲骨文10g 是的你可以 请小心 这是什么Oracle 文档 http download oracle com docs cd B19306 01 server 102 b14200 statemen

随机推荐

  • 为什么 Rails RSpec 响应显示 302 而不是 401?

    我已经被这个问题困扰好几天了 我不知道它出了什么问题 几个月前我开始使用 Ruby on Rails 目前正在学习使用 API 进行身份验证 我看过其他类似的主题here https stackoverflow com questions
  • 在 BinaryObjects 的 Ignite 缓存上执行 SQL

    我正在从 Spark 数据帧创建 BinaryObject 的缓存 然后我想在该 ignite 缓存上执行 SQL 这是我的代码在哪里bank是包含三个字段 id name 和age 的数据框 val ic new IgniteContex
  • MATLAB 的堆栈大小是多少?

    MATLAB R2018a 64 位 的默认堆栈大小是多少 堆栈大小似乎比 64 位 C 程序大 我为什么这么问 我问这个问题是因为我正在调用英特尔 MKL拉帕克 dtrtri https software intel com en us
  • 在java中修改复杂的csv文件

    我想编写一个可以打印和修改不规则csv文件的程序 格式如下 1 date 2 organization name 3 student name id number residence student name id number resid
  • 将视觉选择发送到外部程序而不影响缓冲区

    我想要实现的是将视觉选择发送到外部程序而不影响缓冲区的内容 Example 让以下代码块代表当前缓冲区 让 代表视觉选择的结束 This is not a test 1 lt This is not gt a test 2 This is
  • YouTube 播放器.destroy();即使在验证玩家时也会抛出“this.a is null”

    所以我有一个带有两个面板的小应用程序 使用 iframe API 单击一个面板将全屏展开该面板 并显示 播放视频 按钮和一些附加信息 单击左上角的按钮将使 UI 返回到标准状态 关闭视频并将面板缩小到适合 50 50 现在我们有两个视频 我
  • 如何处理带有图像和文本视图的自定义列表视图中的图像视图的点击?

    我想知道我们如何处理带有图像和文本视图的自定义列表视图上的图像视图的点击 我什至使 Imageview 可点击 这是我的代码 自定义适配器 java public class CustomAdapter extends ArrayAdapt
  • 返回第一个表中的所有数据,如果存在则仅返回第二个表中的 1 个数据

    我正在使用MySql 我有 2 个表 一个是带有主键 propertyId 的名称和数据列表 表 2 包含具有主键 propertyImageId 的图像 每个 propertyId 可能有多个图像或根本没有图像 我需要获取属于agentI
  • SQL不是单组组函数

    当我运行以下 SQL 语句时 SELECT MAX SUM TIME FROM downloads GROUP BY SSN 它返回客户下载的最大总价值 但是如果我尝试通过将其添加到 select 语句来查找该最大值所属的社会安全号码 SE
  • C++ 使用 constexpr 和 lambda 表达式

    我正在看书C 17 完整指南 https rads stackoverflow com amzn click com 396730017X以及第 6 1 节中constexprlambda作者举了两个例子 auto squared1 aut
  • 检查 Swift 中是否存在 func

    我想在调用函数之前检查它是否存在 例如 if let touch AnyObject touches anyObject let location touch locationInView self touchMoved Int locat
  • Glassfish 作为 OSGi 容器

    我正在评估 OSGi 容器 主题是使用 Glassfish 来包含我的 OSGi 应用程序组件 我的问题是 Glassfish 对此有好处吗 有人有以这种方式使用它的经验吗 背景 该应用程序不是 Java EE 应用程序 而是 Spring
  • Bash 在脚本中退出 sudo

    我需要使用 sudo 执行安装脚本 但在脚本结束时 脚本需要退出 sudo 并以普通用户身份继续 Example sudo install sh 脚本以 root 身份运行并执行所需操作 su myscriptuser service my
  • 如何以编程方式获取我的设备的手机号码?

    我尝试过使用两种方法来检索我的电话号码 但这两种方法都不起作用 我用了 电话管理器 订阅管理器 我确实获得了网络名称 国家 地区 iso 和 IMEI 但每当我尝试返回号码时 它都不会返回任何内容 我还添加了这些所需的所有权限 我的清单如下
  • Selenium - 过时的元素引用:元素未附加到 C# 中的页面文档

    我正在使用 selenium 来获取网站表格中的数据进行分析 我必须扫描并获取大约 1000 行的表 我知道该页面有 Javascript 它会自动更新 DOM 但表的行太多 所以当我扫描代码时总是抛出异常 我尝试使用以下代码 Boolea
  • 在 Android 搜索视图中显示建议列表中的选择

    我有一个带有建议列表的搜索视图 如果用户从列表中选择一个项目 则会发送一个新意图 我可以应用我的过滤器 但搜索视图仍为空 如果我使用 setQuery 更新 onNewIntent 中的搜索视图 见下文 效果是所选项目显示在搜索视图中 但建
  • APNs 通过 macOS Sierra 推送通知

    我正在尝试使用连接到的简单 PHP 工具向我的手机发送推送通知ssl gateway push apple com 2195 但连接失败并出现以下错误 Warning stream socket client SSL operation f
  • 通过文件目标完美缓存

    阅读有关的文档后基于文件目标的输出缓存 https docs prefect io core concepts persistence html output caching based on a file target 我认为这个工作流程
  • iPhone SDK 合成 BOOL 数组

    当尝试合成如下所示的 bool 数组时 出现编译器错误 h import
  • getdata() 脚本仅在时间触发时超时

    我正在从另一个电子表格导入一个范围 并使用以下脚本将其粘贴到当前电子表格中 function getdata var values SpreadsheetApp openById XXXXXX getSheetByName SheetB g