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

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(使用前将#替换为@)

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

  • 如何检查 Gmail 标签是否有嵌套子标签?

    使用Google Apps脚本 是否有一个功能可以检查Gmail标签是否有嵌套子标签 如果标签有一个或多个子标签 我想将它们从代码序列中排除 没有直接的方法可以从 父 标签获取标签 但是使用简单的方法来获取标签非常简单getUserLabe
  • 谷歌表格根据今天的日期隐藏行

    在 Google Sheets 中 当 A 列中的日期等于或早于今天的日期时 我需要一个脚本来自动隐藏工作表 1 中的行 因此 如果今天是 2018 年 8 月 29 日 单元格 A3 中的日期是 2018 年 8 月 28 日 则第 3
  • 通过 Apps 脚本强制刷新公式

    有时 更改单元格的值时 电子表格中的公式不会自动刷新 并且单元格上会出现注释以选择该单元格 然后按 CTRL SHIFT E 强制重新加载公式 我想从 Apps 脚本调用此重新加载函数 有没有办法用 Apps 脚本来做到这一点 我尝试了 S
  • Google Sheets API v4 和 valueInputOption

    我的电子表格中有三列 第一个是日期 第二个和第三个是简单字符串 当我批量上传数据时valueInputOption RAW 我的日期列得到错误的结果 所有日期前面都有一个看不见的撇号 字符串列没问题 当我使用valueInputOption
  • 将按钮添加到 Google 表格并在单击时为单元格设置值

    我是 Google 脚本的新手 我有一个包含 5 列的 Google 表格 在每一列上我需要一个按钮 带有文本1 2 3 4 5 在每个按钮上单击我需要将按钮文本设置为相应的单元格并隐藏单击的按钮 是否可以 您可以插入看起来像按钮的图像 然
  • 使用应用程序脚本将 MS Word 文件(保存在云端硬盘中)转换为 Google 文档

    我被某些事情困住了 找不到解决办法 有没有办法使用文件 url 或 id 将存储在 Google Drive 中的 MS Word 文件转换为 Google 文档 我目前有一个电子表格 其中包含文件的网址 或者 也可以使用 python 脚
  • 谷歌电子表格中的“MMMM yy”日期

    我有一个谷歌电子表格 其中我想要一个仅包含月份和年份名称的日期 例如September 2011 而且我还希望月份和年份能够轻松更改 有没有办法获得自定义日期格式来做到这一点 我发现我可以这样做 TEXT 40295 MMMM yy 但是日
  • 使用 Promise 对 Google 表格进行多次查询

    我是一名初学者编码器 需要一些帮助来加快我的 Google 表格查询速度 我环顾四周 找不到解决方案 我正在尝试快速对 Google 表格运行 25 个查询 这就是我的尝试方式 对 Google 工作表运行查询 将结果推送到数组 运行不同的
  • 在Google电子表格中划分整列

    我是 Google 电子表格的一个相对较新的用户 我希望 B 列中的每个单元格都是 A 列 同一行 中内容除以 5 的结果 B1 B2 B3 等 商 应为 A1 A2 A3 等 被除数 除以 5 除数 在示例中 B1 A1 5 我知道一项一
  • 在 Google 表格中创建每周/每月/每年折线图,以汇总同一周/月/年范围内的金额

    我想创建一个代表两列数据的折线图 F 输入日期 和 H 美元金额 X 轴应为日期 Y 轴应为美元金额 问题是我希望折线图上的日期代表给定周 月或年输入的所有金额的总和 这张照片是 YouTube 分析的 它创建了一个与我想在工作表中创建的类
  • 当 Google 任务标记为“已完成”时如何触发 Google 脚本

    Google Apps 脚本允许由各种事件触发脚本 看here https developers google com apps script guides triggers 当用户将任务标记为已完成 在 Google 任务中 时 我想更新
  • 如何在 Google 文档之间复制内容和格式?

    我需要复制 Google 文档的内容 并将其附加到另一个文档 如果我使用这样的东西 newDoc getBody appendParagraph template getText 我得到了文本 但丢失了原始文件中的格式 Bold Itali
  • 如何在多个文档中使用 Google Apps 脚本

    我有一个谷歌应用程序脚本 我想在多个文档中使用它 我也可能想稍后在这些文档中更改它 因此我必须使用same所有这些文档中的脚本 而不是该脚本的副本 我知道以下问题可能属于重复问题 但我不愿意接受它的答案 Google Apps 脚本 如何在
  • 在 Google 表格脚本中设置活动单元格的值

    我想创建一个公式 在某个单元格更改上创建时间戳 下面的代码就可以了 我现在想做的是将公式转换为纯文本 将该时间戳锚定到工作表上 如果您手动执行此操作 您将选择时间戳 复制它们并将它们粘贴为值 我不想手动执行此操作 因此我创建了下面的脚本 它
  • 为什么我们使用 SpreadsheetApp.flush()?

    我的理解是 flush https developers google com apps script reference spreadsheet spreadsheet app flush有助于在功能发生时执行这些功能 而无需将它们捆绑在
  • Google Apps 脚本 - 是否可以仅通过 Google Apps 脚本更改表格中的某些单元格?

    我在 Google SpreadSheet 中制作了一个目录 我的电子表格有一个表格 用户可以在其中添加信息 该表是通过从数据库表获取数据的脚本动态创建的 用户可以编辑表中的某些单元格 然后单击按钮将更改保存回数据库表中 我想限制他可以手动
  • 如何在谷歌电子表格中获取台湾证券交易所指数

    如何在谷歌电子表格中获取台湾证券交易所指数 该索引确实存在于谷歌金融中https www google com finance q TPE 3ATAIEX https www google com finance q TPE 3ATAIEX
  • 阅读 Google 文档电子表格

    是否可以使用 PHP 从 Google Docs 电子表格中提取行 在 SQL 中我会使用类似的东西 SELECT FROM table WHERE field value LIMIT 1 有没有办法做到这一点 我听说你应该使用 Zend
  • Google 表格 - ARRAYFORMULA 中的 VLOOKUP

    我正在尝试在 Google 表格中的数组公式内进行 Vlookup 我有两张纸 S1 和 S2 每个列都有 3 个相同的列 A 列 日期 B 列 名称 和 C 列 付款类型 我想根据日期和姓名组合匹配将付款类型从表 2 读取到表 1 这意味
  • 使用 Google Advanced Drive 服务通过 Apps 脚本在文件夹中创建新文件

    创建新文件有四种方法 DocsList 显示为DocsList在主列表中 内置于 Apps 脚本中 DriveApp 显示为Drive在主列表中 内置于 Apps 脚本中 驱动器 API 也显示为Drive在主列表中 必须添加到 Apps

随机推荐

  • 如何向 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