Google Apps 脚本电子表格范围处理(获取处理集;设置不起作用)

2023-12-22

我再次回到 SO 来解决 GAS 问题,因为我对 Javascript/GAS 还不太熟悉。我对基于有效方式处理函数调用的方法的脚本运行速度有多慢感到有些麻烦。

我读过好几个地方(啊,是here https://developers.google.com/apps-script/best_practices#OptimizeScripts),做一个“全部读取”然后“全部写入”以获取解析设置值(至少在电子表格中)是faster比做一个“取一,写一”方法(出于显而易见的原因,这是有道理的)。

我知道如何获取范围内的所有值,但我不太确定如何遍历(多维)数组、处理数据并设置新的 Range因此。

问题:该函数启动大约需要2秒,运行50行大约需要5秒。问题是,我可能会在这个电子表格中有数千行,并且要让这个函数运行到ensure在我看来,数据经过正确的后处理,以便 Boomerang Calendar 正确获取时间数据,这有点荒谬。该脚本需要处理每列数据所需的时间是原来的两倍,这是可怕的。我担心在下个学期我会经常超出我的“气体处理时间限制”。

这是起始代码(不好,我承认):

function fixApostrophes() {
  // Get the active spreadsheet to run the script on
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // Get the active sheet within the document to run the script on
  var sheet = spreadsheet.getActiveSheet();

  // Get max number of rows needed to process
  var maxRows = sheet.getLastRow();

  // Get the range for the startTime column and endTime column
  var apostropheRange = sheet.getRange(1, 10, maxRows, 2);

  // Get the value in each cell, remove apostrophes from the start,
  // and replace the value in that cell
  for (var i = 1; i < apostropheRange.getNumRows(); ++i) {

    // Get the cells for startTime and endTime to speed things up a bit
    var startCell = apostropheRange.getCell(i, 1);
    var endCell = apostropheRange.getCell(i, 2);

    // Get the values for startTime and endTime
    var startTime = startCell.getValue();
    var endTime = endCell.getValue();

    // Remove apostrophes from start of startTime
    while(startTime.charAt(0) == "'") {
      startTime = startTime.substring(1);
    }

    // Remove apostrophes from start of startTime
    while(endTime.charAt(0) == "'") {
      endTime = endTime.substring(1);
    }

    // Set the values for startTime and endTime
    startCell.setValue(startTime);
    endCell.setValue(endTime);
  }
}

这和我的情况有很大关系上一个问题 https://stackoverflow.com/questions/15991777/google-apps-script-on-form-submit-time-formatting-glitch-fix关于修复时间格式撇号问题,该问题破坏了用于安排事件的 Boomerang 日历功能。

解决方案:使用以下命令将 Range 中的值拉入二维数组Range.getValues()功能。处理二维数组中的每个值(逐行可能是最合乎逻辑的方法),然后update编辑值与新值的索引(请参阅代码中的 Srik-answer 注释)。之后,使用以下方法将 2D 数组中的元素放回到原始 Range 中Range.setValues(2Darray)。如果您遇到它,我希望这对您有所帮助!这也是much比我的原始代码中多次调用 API 更快。

function myNewLibraryFunction(startCol, numColumns) {

  // Get the active spreadsheet to run the script on
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // Get the active sheet within the document to run the script on
  var sheet = spreadsheet.getActiveSheet();

  // Get max number of rows needed to process
  var maxRows = sheet.getLastRow();

  // Get the range for the startTime column and endTime column
  var dataRange = sheet.getRange(1, startCol, maxRows, numColumns);
  var values = dataRange.getValues();

  // Get the value in each cell, remove apostrophes from the start,
  // and replace the value in that cell
  for (var i = 1; i < maxRows; ++i) {

// Get the values for startTime and endTime
var startTime = values[i][0];
var endTime = values[i][1];

    // Remove apostrophes from start of startTime
    while(startTime.charAt(0) == "'") {
      startTime = startTime.substring(1);
    }

    // Remove apostrophes from start of startTime
    while(endTime.charAt(0) == "'") {
      endTime = endTime.substring(1);
    }

    values[i][0] = startTime; // New stuff from Srik's answer
    values[i][1] = endTime; // New stuff from Srik's answer
  }
  dataRange.setValues(values);
  SpreadsheetApp.flush(); // New stuff from Srik's answer
}

基本上,您对 GAS 中列出的 API 进行的大多数函数调用都需要比常规 JavaScript 更多的时间。根据您的情况,减少对 Range 和 Sheet 类的调用次数

function fixApostrophes() {
  // Get the active spreadsheet to run the script on
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // Get the active sheet within the document to run the script on
  var sheet = spreadsheet.getActiveSheet();

  // 1. Replace two calls and many other calls later with one. 
  var dataRange = sheet.getDataRange(); 
  var values = dataRange.getValues();// a 2D array

  // Get the value in each cell, remove apostrophes from the start,
  // and replace the value in that cell
  for (var i = 1; i < values .length ; ++i) {

    // Get the values for startTime and endTime
    var startTime = values [i][0];
    var endTime = values [i][1];

    // Remove apostrophes from start of startTime
    // These are okay. Regular Javascript - not time consuming
    while(startTime.charAt(0) == "'") {
      startTime = startTime.substring(1);
    }

    // Remove apostrophes from start of startTime
    while(endTime.charAt(0) == "'") {
      endTime = endTime.substring(1);
    }

  }

  dataRange.setValues(values);
}

提示:您可以在执行记录中查看每个调用花费了多少时间

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

Google Apps 脚本电子表格范围处理(获取处理集;设置不起作用) 的相关文章

  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • ArrayFormula 破坏了 getLastRow() 函数。可能的解决方法?

    在我的电子表格中 我有一个正在运行的脚本 它使用getLastRow 功能是其逻辑的重要组成部分 自从我在其中一列中应用数组公式以来 getLastRow 功能无法正常工作 即使其他列中没有其他值 数组公式似乎也一直 应用 到工作表的底部
  • Google Apps 脚本 - 是否可以仅通过 Google Apps 脚本更改表格中的某些单元格?

    我在 Google SpreadSheet 中制作了一个目录 我的电子表格有一个表格 用户可以在其中添加信息 该表是通过从数据库表获取数据的脚本动态创建的 用户可以编辑表中的某些单元格 然后单击按钮将更改保存回数据库表中 我想限制他可以手动
  • 用于设置形状颜色的 Google Apps 脚本

    我正在查看 Google Apps 脚本参考here https developers google com apps script reference slides fill setSolidFill Color 并注意到有一种方法set
  • Google 表格 - ARRAYFORMULA 中的 VLOOKUP

    我正在尝试在 Google 表格中的数组公式内进行 Vlookup 我有两张纸 S1 和 S2 每个列都有 3 个相同的列 A 列 日期 B 列 名称 和 C 列 付款类型 我想根据日期和姓名组合匹配将付款类型从表 2 读取到表 1 这意味
  • 在 Google Apps 脚本中,如何为我实现的服务设置 HTTP 响应代码?

    假设我有一个返回 XML 文档的 服务 function doGet var result
  • 如何隐藏工作表?

    如何使用 googleScript 隐藏电子表格应用程序中的一些工作表 我有一个包含多个工作表的电子表格 我想使用 googlScript 将电子表格缩小为仅第一个可见工作表和所有其他隐藏工作表 sheet hideSheet https
  • window.location.href = window.location.href 返回空白页

    我正在使用 Google App Script 创建一个网页 单击按钮后 我尝试重新加载页面 但以下操作均无效 窗口 位置 href 窗口 位置 href window location reload true 他们正在重定向到空白页面 下
  • 谷歌表格在一行上的不同单元格范围上添加时间戳

    我一直试图在与该行上两个不同单元格范围相对应的行上放置两个时间戳 我已成功使用此脚本对行上的任何更改 第 5 列之后 添加时间戳 我想要的是 如果单元格范围 F 到 L 发生任何更改 则在 E 列中放置一个时间戳 然后 如果从 N 列到 Z
  • 在 Swift 中将单个整数值视为一个范围

    我需要验证字符串的长度 字符计数允许的值为 6 9 个字符 12个字符 15 个字符 所有具有不同字符数的字符串均无效 因此 我想创建一个 Swift 函数 它接受多个范围并计算字符串 extension String func evalu
  • 向文档添加动态页眉/页脚

    我想知道是否有一种方法可以向文档添加动态页眉或页脚 即在页脚中添加每个页面都不同的 页面标题 据我所知 编辑内置页眉或页脚将反映在每个页面上 我想知道是否有人想到了一种解决方法 通过访问页面上的第一行 最后一行并在那里插入文本来 强制 它
  • Google 脚本:如何编写从驱动器中的 txt 自动导入电子表格的脚本?

    我以前从未使用过 Javascript 而且多年来我一直在尝试这样做 但没有成功 而且我找不到任何以前的人尝试过 我想直接从驱动器中的 txt 文档复制文本数据 可以手动完成此操作 但我希望每天自动完成 文本文件 Boxes Made 3
  • 根据表单提交创建名称的新工作表

    在 Google Sheets 中 我有一个脚本 用于为提交的每个 Google 表单创建一个新工作表 它应该创建一个新工作表 其名称基于最后一列 G 列 不是表单提交的列 然后 它从最后一行和标题行获取信息并将其复制到创建的工作表的前两行
  • range() 真的创建列表吗?

    我的教授和this guy http www secnetix de olli Python lambda functions hawk声称range创建值列表 注意 range 函数只是返回一个包含数字的列表 从 x 到 y 1 例如 r
  • 将时间戳转换为一个数组

    在应用程序脚本 谷歌表中运行 我从 API 获取时间戳并返回此结果 1 6370611672429312E18 1 63706107263277082E18 我执行此代码并且工作正常 但问题不在数组中 我每次都需要它在数组中 const t
  • Google Apps 脚本中 $.ajax() 的服务器端等效项是什么?

    我想在 Google App 脚本中从服务器端代码执行 HTTP 请求Authorization标头 是否有用于发送 HTTP 请求的 App Script API Google Apps 脚本中的这段代码相当于什么 var api URL
  • Google Sheets API追加方法(最后在顶部)

    使用 google Sheets api 附加方法 任何语言 时 要附加到工作表的值将添加到最后一个非空行之后 因此 新值出现在工作表底部 如下所述 https developers google com sheets api refere
  • Google 文档有内容控制吗?

    我对 Google 文档和内容控制有疑问 如果有的话 我们有一个系统 允许用户设计带有内容控件 rtf 文本 组合框等 的 MS Word 文档 并为控件分配一个 ID 以便我们的系统可以提取 ID 并注册答案 然后数据被保存在数据库中 什
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答
  • 根据日期自动对数据进行排序

    我正在尝试使我的电子表格根据日期自动对数据进行排序 我附上了我正在使用的电子表格的照片 您会注意到 G 列中有一个工作日公式 目前 一旦我更新了配药日期 重新订购日期就会根据公式进行更新 基于安排的工作日 然后我对 G 列使用 SORT R

随机推荐

  • Android:setContentView 和 LayoutInflater

    有什么区别setContentView and LayoutInflater 我们使用的原因是什么inflater在定制中toast and setContentView在定制中alertbox 在此之前你需要明白一些事情 In Andro
  • 使用 iText 将图像添加到 PDF

    我正在尝试使用 iText 将图像添加到 PDF 文件 文件从 TXT 转换为 PDF 并且应该添加图像 Convert Reports to PDF File conv new File Report Forms String files
  • 如何提高cassandra的写入性能?

    我有一个名为 电子邮件 的列族 我正在将邮件保存到此 CF 中 编写 5000 封邮件需要 100 秒以上 我使用的是 i3 处理器 8GB 内存 我的数据中心有 6 个节点 复制因子 2 我们存储到 Cassandra 中的数据大小会影响
  • 如何在 .emacs 中创建特定的窗口设置

    我对 emacs 和 Lisp 很陌生 尽管根据其他函数式语言的经验 模仿我在有用的代码片段中看到的内容并不难 我在 emacs 文件中添加了一些不错的窗口切换功能 并且它们运行良好 但在启动时 我想配置窗口 框架的特定排列 基本上 我想在
  • 以编程方式设置打印机绕过 Windows 后台处理程序

    有没有办法以编程方式配置打印到文件 本地文件端口 的打印机以绕过后台打印程序服务并将数据直接发送到文件 我查看了 prnadmin dll 没有任何相关 和WMI 没有任何相关 有任何想法吗 不 我不想停止 Windows XP SP3 中
  • 使用 cURL 发送文件

    我已经使用 cURL 发送了一些发布数据 现在正在尝试发送文件 但在途中迷路了 我正在使用带有文件输入的表单 然后希望 cURL 将其发送到我的服务器 这是我的上传页面
  • 为什么这个具有可变对象名称的 AngularJs 服务返回一个未定义的对象?

    Scenario 我想使用此服务来共享我的 webApp 内的一些属性 该服务内部应该有一些对象 并且控制器应该能够获取和设置这些对象 JS var oneApp angular module myApp ui bootstrap ngTo
  • 带有nodejs和express的静态文件夹

    var app require express server require http createServer app io require socket io listen server server use app static pu
  • 使用javascript计算数组中的数字总和

    我正在尝试获取数组中所有数字的总和 我试图以最简单的方式做到这一点 但总和显示 NAN 为什么会这样呢 请帮忙 var numbers 45 34 12 10 8 9 var i for i 0 i
  • 如何在android中以编程方式通过图像链接设置壁纸?

    我正在尝试通过图像链接设置为壁纸 我的问题 如何显示 从服务器加载图像 对话框和 设置壁纸 对话框 在此弹出窗口出现后询问用户要设置的位置 现在的情况 当用户单击 设置壁纸 按钮时 它只显示对话框消息并继续加载 然后用户需要关闭弹出窗口并再
  • 嵌入式kafka和testcontainers kafka的区别?

    我有简单的 spring boot kafka 监听器 我想测试一下 使用嵌入式 kafka 进行测试 VS 使用测试容器 kafka 进行测试有何缺点 我熟悉测试容器 它提供了完全功能性的kafka 嵌入式kafka相对于容器有什么局限性
  • 获取媒体 url,包括服务器部分

    是否可以通过以下方式获取网址MediaManager GetMediaUrl总是包括服务器部分 为了提高这一点 在 Sitecore 7 中AlwaysIncludeServerUrl选项也包含在MediaUrlOptions 不知道从哪个
  • Doctrine/Symfony:具有非映射属性的实体

    如何将属性添加到Entity哪些类不应该映射到数据库 我需要该房产作为临时价值 因此 不应从数据库中获取该属性或将其保留到数据库中 它也不应该是 sql 计算的值 我只需要在 php 代码中设置 和获取 它 编写没有注释的属性不应作为实体用
  • 如何在 Visual Studio 2017 中使用 Jupyter Notebook?

    Visual Studio 2017 现在支持使用 Jupyter Notebook 在 Visual Studio 2017 中围绕 Python 转一圈 https blogs msdn microsoft com visualstud
  • pygame:图像和精灵有什么区别?

    导入火箭精灵 例如 并将其设置为图像与导入火箭精灵并将其设置为 pygame 中的精灵有什么区别 我认为您只是对术语感到困惑 Image 图像只是像素的集合 您使用 sprite 来引用磁盘上的图像 但这只是一个图像文件 要使用火箭示例 您
  • java中有一种测量网络延迟的方法

    我正在编写一个简单的程序 一开始我将 ping 所有 MAN 主机以验证所有主机是否在线 完整 但我想实现某种方法来测量主机之间的延迟 有什么办法可以做到这一点吗 有小费吗 无论如何 谢谢你 您可以保留时间戳ping和pong打包并简单地计
  • VS Code pylint(import-error)“无法从自定义目录导入”子模块

    我已经将自己编写的 Python 脚本组织在由几个子目录组成的树中 从已包含在中的父目录 Scripts 开始 python autoComplete extraPaths 在设置 json 中 python autoComplete ex
  • 当拨出电话被接听时,PhoneStateListener 的状态是什么?

    我想知道我的应用程序何时接听拨出电话 我正在使用一种称为onCallStateChanged 来自PhoneStateListener班级 当拨出呼叫被应答时 我正在查看 Logcat 以查看它进入哪种状态 空闲 摘机或振铃 根据文档 我认
  • 简化 ReaderT 环境中存储的函数的调用

    假设我有这样的环境记录 import Control Monad IO Class import Control Monad Trans Reader type RIO env a ReaderT env IO a data Env Env
  • Google Apps 脚本电子表格范围处理(获取处理集;设置不起作用)

    我再次回到 SO 来解决 GAS 问题 因为我对 Javascript GAS 还不太熟悉 我对基于有效方式处理函数调用的方法的脚本运行速度有多慢感到有些麻烦 我读过好几个地方 啊 是here https developers google