加快应用程序脚本上的行删除速度

2024-01-07

我编写了这段代码,根据列是否为空来删除空行,代码正在运行并执行其需要执行的操作,但是从包含超过 15k 行的工作表中删除数据需要 10 多分钟数据,有没有办法加快速度?

function deleteEmptyRowsAll() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  var data = sheet.getRange('B:B').getDisplayValues();
  for (i = data.length - 1; i >= 2; i--) {
    if (data[i][0] === '') {
      sheet.deleteRow(i + 1);
    }
  }
}

编辑:问题没有作为帖子得到回答如果 Google App 脚本中的特定列有空值,如何快速删除行 https://stackoverflow.com/questions/72447883/how-to-delete-rows-fast-if-they-have-empty-values-at-specific-columns-in-google清除该行的内容而不是删除整行。


您的代码使用SpreadsheetAppAPI。它运行缓慢的原因是它单独调用来单独删除每一行。要通过该 API 更有效地删除行,请将连续行分组并一次性删除这些行批次,如下所示:

/**
* Deletes all rows in Sheet1 where the value in column B2:B is blank.
*/
function deleteRowsWhereColumnBIsBlank() {
  const ss = SpreadsheetApp.getActive();
  const column = ss.getRange('Sheet1!B2:B');
  const condition = (row) => row[0] === '';
  ss.toast(`Deleting rows...`);
  const numDeletedRows = deleteRowsConditionally_(column, condition);
  ss.toast(`Deleted ${numDeletedRows} rows.`);
}


/**
* Deletes all rows where a condition closure returns true.
*
* @param {SpreadsheetApp.Range} range The range to look at.
* @param {Function} condition A closure {String[]} that determines whether a row should be deleted.
* @return {Number} The number of rows deleted.
*/
function deleteRowsConditionally_(range, condition) {
  // version 1.0, written by --Hyde, 8 September 2022
  //  - see https://stackoverflow.com/q/73651127/13045193
  const rowStart = range.getRow();
  const values = range.getDisplayValues();
  const rowsToDelete = [];
  values.forEach((row, rowIndex) => {
    if (condition(row)) {
      rowsToDelete.push(rowStart + rowIndex);
    }
  });
  deleteRows_(range.getSheet(), rowsToDelete);
  return rowsToDelete.length;
}


/**
* Deletes from a sheet the rows whose row numbers are given in an array.
*
* @param {SpreadsheetApp.Sheet} sheet A spreadsheet sheet where to delete rows.
* @param {Number[]} rowsToDelete The rows to delete, identified by 1-indexed row numbers.
* @return {Number} The count of delete operations done, i.e., number of the consecutive row runs deleted from the sheet.
*/
function deleteRows_(sheet, rowsToDelete) {
  // version 1.1, written by --Hyde, 21 August 2022
  const rowNumbers = rowsToDelete.filter((value, index, array) => array.indexOf(value) === index);
  const runLengths = getRunLengths_(rowNumbers.sort((a, b) => a - b));
  for (let i = runLengths.length - 1; i >= 0; i--) {
    sheet.deleteRows(runLengths[i][0], runLengths[i][1]);
  }
  return runLengths.length;
}


/**
* Counts consecutive numbers in an array and returns a 2D array that
* lists the first number of each run and the number of items in each run.
*
* The numbers array [1, 2, 3, 5, 8, 9, 11, 12, 13, 5, 4] will get
* the result [[1, 3], [5, 1], [8, 2], [11, 3], [5, 1], [4, 1]].
*
* For best results, sort the numbers array like this:
* const runLengths = getRunLengths_(numbers.sort((a, b) => a - b));
* Note that duplicate values in numbers will give duplicates in result.
*
* @param {Number[]} numbers The numbers to group into runs.
* @return {Number[][]} The numbers grouped into runs, or [] if the array is empty.
*/
function getRunLengths_(numbers) {
  // version 1.1, written by --Hyde, 31 May 2021
  if (!numbers.length) {
    return [];
  }
  return numbers.reduce((accumulator, value, index) => {
    if (!index || value !== 1 + numbers[index - 1]) {
      accumulator.push([value]);
    }
    const lastIndex = accumulator.length - 1;
    accumulator[lastIndex][1] = (accumulator[lastIndex][1] || 0) + 1;
    return accumulator;
  }, []);
}

为了获得更好的性能,请使用 Sheets API,如 Tanaike 在本线程和快速删除 Google 应用脚本中的特定列 https://stackoverflow.com/a/72602266/13045193.

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

加快应用程序脚本上的行删除速度 的相关文章

  • 将 html 嵌入 google 工作表

    我想通过创建一个 html 元素并将其放在电子表格顶部来在电子表格顶部显示 HTML 例如 如果我通过合并 A1 G5 在工作表顶部创建了一个大单元格 是否可以在其中嵌入 html div h1 Hello World h1 div 我注意
  • QUnit 删除依赖项上的方法会破坏针对该依赖项的测试

    在 Google Apps 脚本中 我正在对我正在开发的应用程序进行单元测试 使用 QUnit https github com simula innovation qunit tree gas gas 使用测试驱动开发 正在测试的代码 我
  • 如何让 Google Apps 脚本进行 SHA-256 加密?

    我需要使用文本输入 1 轮 十六进制输出 SHA 256 加密来加密字符串 这应该是一个长度为 64 的字符串 我在 Google Apps 脚本文档中尝试过的每个 SHA 256 加密模块都会返回一组数字 例如 function SHA2
  • 如何使用 Google Apps 脚本添加指向电子表格单元格的链接

    可以通过用户界面向 Google 电子表格中的单元格添加 链接 我想使用 Google Apps 脚本执行相同的操作 我本以为 Range 类上有一种方法可以实现这一点 但看不到 有谁知道如何做到这一点 截至 2020 年 6 月 可以选择
  • 选择列的最后一个值

    我有一个电子表格 G 列中有一些值 有些单元格之间是空的 我需要将该列中的最后一个值获取到另一个单元格中 就像是 LAST G2 G9999 除了那个LAST不是一个函数 类似的答案卡里加里的回答 https stackoverflow c
  • AdminDirectory.Members.list 授权错误

    我正在尝试使用 Admin SDK 并尝试在 Google 电子表格中列出群组成员 这是我想出的代码 function recordGroupsMembers var ss SpreadsheetApp getActiveSpreadshe
  • 模板化 HTML 脚本中的换行符

    如果我有一个 HTML 文件 test html p p 和一个脚本函数 var t HtmlService createTemplateFromFile test html t str test nstring var content t
  • 如何在表单提交时运行 Appscript?

    我正在尝试创建当用户完成表单提交时重定向到网络应用程序的 Google 表单 我查过谷歌开发者文档 https developers google com apps script guides triggers 但我看不到一种简单的方法来做
  • 生成多列范围的所有唯一值的列表,并根据这些值在最后 X 列中出现的次数对这些值进行评级

    正如标题所说 我有一个这样的范围 A B C duck fish dog rat duck cat dog bear bear 我想要的是获取范围内所有唯一值的单列列表 并根据它们在最后 X 列中出现的次数为它们分配评级 或等级 更多列不断
  • Google Apps 脚本自动生成的库文档

    我目前正在开发一个 Google Apps 脚本库 它基本上将电子表格视为数据库对象 目前 该库有两个相同的功能 例如 Opens and creates a query object for a spreadsheet with the
  • 如何将条件格式从一个文档复制到另一个文档?

    Google电子表格可以将单元格格式复制到目标单元格 但似乎 条件格式 信息没有被复制 我们可以将 条件格式 从一个文档复制到另一个文档吗 我知道我们可以从 条件格式 对话框中重新创建它 但这确实很耗时 而如果我们可以复制和粘贴 那就太棒了
  • 正则表达式 - 使用正则表达式提取电子邮件文档的子字符串

    我正在尝试使用正则表达式提取电子邮件文档的子字符串 我正在在线测试正则表达式 它运行得很好 在线正则表达式测试器 https regex101 com r BbWBPk 1 我有一个功能可以检查 Google Apps 脚本上的正则表达式
  • 如何下载以前保存的 Google Apps 脚本修订版本?

    我仍在尝试从中恢复不知何故 丢失 了 Google Apps 脚本 https stackoverflow com questions 33697789 当我创建脚本的副本以将代码分叉到另一个项目时 我的想法是尝试通过驱动器 API 下载
  • 电子表格的 Google 脚本(If 语句)

    我希望有人能帮助我解决这个问题 我是编码新手 我有一个谷歌电子表格 其中有一个可以推送电子邮件的脚本 我试图让脚本忽略脚本已发送电子邮件的行 function onOpen var ui SpreadsheetApp getUi Or Do
  • 如果您有多个表单向单个电子表格发送响应,Google 如何知道提交表单时要执行哪个 onsubmit 触发器

    我需要有人澄清 据我了解 多个表单可以将其回复发送到新 Google 表格中的单个电子表格 因此 我创建了两个 Google 表单 并让他们都将回复发送到新的 Google 电子表格 然后我在电子表格 而不是表单 中创建了两个脚本 每个脚本
  • 清除内容并从另一张纸复制

    我编写了一个脚本 旨在清除 Google Sheets 电子表格的内容并复制并粘贴另一个工作表的内容 需要清除的工作表称为 NEW SHEET 要复制的工作表称为 Database 由于某种原因 该脚本目前无法运行 当我运行它时什么也没有发
  • 复制带有内嵌图像的表格

    我正在尝试将 GDoc 的内容复制到另一个 GDoc 中 这对于所有不同的元素类型都非常有效 包括一个表 枚举DocumentApp ElementType TABLE 但是 如果表包含内联图像 EnumDocumentApp Elemen
  • 如何使用 google Sheet 作为数据库

    如何在 HTML Web 应用程序中生成 Google 工作表数据 并允许用户从 HTML Web 应用程序更新评论 我在谷歌表中有一些数据 通过谷歌表单提交 我想使用搜索按钮根据 请求编号 从网络应用程序搜索工作表数据 应该能够更新网络应
  • 自动从外部数据库加载 Google 电子表格数据

    我有一个共享的 Google 电子表格 工作表的某些列必须填充数据库服务器 PostgreSQL 中存在的数据 SQL 查询 此外 数据加载必须安排为自动完成 例如每天 1 点 最后 我需要在电子表格中进行一些调整 例如 加载后将日期时间放
  • 如何修复 OnChange 脚本,该脚本运行良好,但在修改 Google 表格后停止运行

    概述 工作簿根据每条记录的类别分数计算每条记录 或行 的总体分数 类别分数是通过对每个记录的数百个数据点执行的计算得出的 根据我在网上找到的几个示例和教程 我编译了代码以发送名为 checkComplete 的 onChange 电子邮件

随机推荐

  • 如何向 html 表格添加 jQuery 过滤器?

    我正在尝试使用 JQuery 将下拉过滤器放入 html 表中 这是代码 报告 php table class table table striped thead tr th th th First Name th th Last Name
  • 从 JavaScript 函数对象的名称获取字符串形式?

    在 JavaScript 中 如果变量中有一个字符串 有没有办法获取对具有匹配名称的函数对象的引用 请注意 我可以使用 jQuery 因此我也可以使用它的任何辅助方法 例如 myFunction function var func name
  • 是否可以只需要测试而不需要安装包?

    我正在向现有的可安装 pip 的项目添加功能 项目所有者认为我的添加pandas对 setup py 的安装要求 太重 因为该项目应该保持苗条 我添加的功能不需要pandas 因为该功能是在pandas DataFrame对象 但我为它编写
  • 如何在 ActionBarSherlock 中实现多选和上下文 ActionMode?

    我应该如何使用 ActionBarSherlock 在 AdapterView 上实现多选 因为它不提供 MultiChoiceModeListener 这就是它的样子 你怎么能这样做呢 这就是我所做的 编辑 自从我发现之前的答案有很多无用
  • Node.js Firestore 查询选择字段路径列表

    我尝试创建并返回一个新的 Query 实例 该实例将字段掩码应用于结果并仅返回指定的字段子集 当我使用时 let query firestore collection col select field1 field2 field3 get
  • ANDROID_HOME 未设置(VSTS 代理在 OS X 上作为服务运行)

    我已经在 MacBook Pro 上配置了 VSTS 代理 当我手动运行它时 使用 run sh 但是 当我将 VSTS 代理配置为作为服务运行时 使用 svc sh install and svc sh start 并在 VSTS 中对新
  • Fabric.js + 谷歌字体

    可以用吗Fabric js https github com kangax fabric js wiki How to render text使用网络字体 而不附加 Cufon 库及其字体 我可以使用标准画布功能轻松做到这一点 所以我想知道
  • 如何将 Nullable DateTime 变量的 null 值转换为 DbNull.Value

    我有一个可为空的日期时间变量 我想将它写入 SQL DB 当我尝试插入时 如果变量有值就没有问题 但如果它没有值 插入就会因错误而中断 我想问 如何通过DbCommand参数向Sql插入可为空的DateTime P S Sql 列也可以为空
  • onStartJob 和 onStopJob 无法在 android 中运行后台线程

    实际上我想使用 JobScheduler 进行通知 无论应用程序是否处于活动状态 我是 android 新手 首先只是尝试运行后台 AsyncTask 来检查它是否工作正常 但它不起作用 这是我的 JobService 代码 public
  • PyCharm - 作者是否出现在导入之前?

    当您创建新的 python 文件并添加新的导入时 PyCharm 会尽可能自动添加导入和 author 标签 但是 默认情况下 author 标签将始终出现在任何导入的下方 在我看来 author 标签应该位于文件的顶部 我也可以在其中放置
  • 在 RoR 中哪里可以重新开放课程

    我正在尝试重新打开StringRails 中的类并添加更多方法供我的应用程序使用 编写代码不是问题 我的问题是该代码应该放在哪里 对我来说 在不同的模型文件中重新打开一个类是没有意义的 因为它实际上与任何模型都没有任何关系 我想也许在某个地
  • LINQ - 组合多个列表以形成一个新列表并按键对齐它们?

    我有两个不同列的列表 但每个列表都有一个具有相同键的公共列 如何将它们组合成一个新列表 即 public class TradeBalanceBreak public int CommID get set public int CPFirm
  • 如何防止 Vue 中的对话框完成之前选择表单被更改

    我有一个包含各种选项的选择字段 当用户单击该字段来更改当前选择时 我需要启动一个提示 让用户确认他们希望继续更改 因为这将需要他们重做一个漫长的过程 如果他们取消更改 则需要防止所选选项发生更改 因为即使是快速的临时更改也会触发客户端上的自
  • “内部”与“关联”流缓冲区之间的区别

    From http www cplusplus com reference ios ios rdbuf http www cplusplus com reference ios ios rdbuf 一些派生流类 例如 stringstrea
  • 如何使用 Spring Data JPA 和 Spring Security 实现 AuditorAware?

    我们在应用程序中使用 Hibernate JPA Spring Spring Data 和 Spring Security 我有一个标准User使用 JPA 映射的实体 此外 我还有一个UserRepository public inter
  • Git:将本地git子模块(包括子模块文件)推送到远程裸存储库

    我有两个负责管理的本地项目git 一个依赖另一个 就像这样 project A project B file B file B 对我来说这是有道理的project B作为 git 子模块project A 现在 我已经设置了远程bare存储
  • android .getTop() 返回 0.0

    我正在开发一个安卓锁屏应用程序 我从另一个线程中得到了这个想法 检查手指按下的坐标与我设置的图像按钮的坐标 我正在尝试使用以下方法获取图像按钮的坐标 getTop and getLeft 但两者都返回 0 0 因为它们是浮点数 而不是整数
  • 如何直接使用 NGINX 提供所有现有静态文件,但将其余文件代理到后端服务器。

    location proxy set header X Real IP remote addr proxy set header Host host proxy set header X Forwarded For proxy add x
  • C# 中 bool* 的用处

    我可以用吗bool 以任何有意义的方式 我将如何转换bool to a byte例如 或存储bool 以一个字节为单位 我的目标是在我的项目中管理我自己的记忆 具体细节并不重要 只是我喜欢做的事情 现在我希望能够存储我自己的变量 并且我恰好
  • 加快应用程序脚本上的行删除速度

    我编写了这段代码 根据列是否为空来删除空行 代码正在运行并执行其需要执行的操作 但是从包含超过 15k 行的工作表中删除数据需要 10 多分钟数据 有没有办法加快速度 function deleteEmptyRowsAll var shee