用于在 Google 表格中进行多次查找和替换的 Google Apps 脚本

2024-02-15

关于 Stack Exchange 的第一个问题,希望它有意义。

一些背景:我在学校环境中工作,并协助学习支持人员为某些学生创建更易读的时间表。

他们从我们的网站复制时间表数据,其中包含科目代码、教师姓名和房间号。它的格式与您在下图中看到的格式完全相同 - 我只是将其复制到 Google 表格中。

我本质上需要对所有这些代码执行批量查找和替换,并完全扩展它们,以便主题代码例如01ENG02 变为“英语”和教师代码,例如JBO 成为“乔·布洛格斯”

我有一个完整的列表,列出了我需要代码扩展的内容 - 这就是如何最好地实现这一点。

以下是我在 Stack Exchange 和我正在使用的其他网站上找到的一些 Google 脚本代码:

function runReplaceInSheet(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("StudentTimetableEntry");

  // Replace Subject Names
  replaceInSheet(sheet, /\d\dART\d\d/g, "Art");
  replaceInSheet(sheet, /\d\dCCL\d\d/g, "Communication & Culture");
  replaceInSheet(sheet, /\d\dDLT\d\d/g, "Digital Technology");
  replaceInSheet(sheet, /\d\dDRA\d\d/g, "Drama");

  // Replace Staff Names  
  replaceInSheet(sheet, 'TED', 'Tahlee Edward');
  replaceInSheet(sheet, 'TLL', 'Tyrone LLoyd');
  replaceInSheet(sheet, 'TMA', 'Timothy Mahone');
  replaceInSheet(sheet, 'TQU', 'Tom Quebec');
}

function replaceInSheet(sheet, to_replace, replace_with) {
  //get the current data range values as an array
  var values = sheet.getDataRange().getValues();

  //loop over the rows in the array
  for (var row in values) {
    //use Array.map to execute a replace call on each of the cells in the row.
    var replaced_values = values[row].map(function(original_value) {
      return original_value.toString().replace(to_replace, replace_with);
    });

    //replace the original row values with the replaced values
    values[row] = replaced_values;
  }

  //write the updated values to the sheet
  sheet.getDataRange().setValues(values);
}

这非常有效。然而,我有超过 150 名员工姓名,以及大致相同数量的主题代码。该过程达到了最大时间,我确信必须有更好的编码方法。

我会考虑其他方法,但请记住,对于将使用它的员工来说,它需要尽可能简单。


每次你打电话getValues and setValues在您的脚本中,涉及相当大的开销成本,并且会减慢您的脚本速度。 (Google 应用程序脚本超时 ~ 5 分钟? https://stackoverflow.com/questions/14450819/google-app-script-timeout-5-minutes)我修改了上面的脚本以进行 1 次调用getValues和 1 次致电setValues。在将修改后的时间表粘贴回工作表之前,代码将所有替换应用于内存中的数组。

function runReplaceInSheet(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("StudentTimetableEntry");
  //  get the current data range values as an array
  //  Fewer calls to access the sheet -> lower overhead 
  var values = sheet.getDataRange().getValues();  

  // Replace Subject Names
  replaceInSheet(values, /\d\dART\d\d/g, "Art");
  replaceInSheet(values, /\d\dCCL\d\d/g, "Communication & Culture");
  replaceInSheet(values, /\d\dDLT\d\d/g, "Digital Technology");
  replaceInSheet(values, /\d\dDRA\d\d/g, "Drama");

  // Replace Staff Names
  replaceInSheet(values, 'TED', 'Tahlee Edward');
  replaceInSheet(values, 'TLL', 'Tyrone LLoyd');
  replaceInSheet(values, 'TMA', 'Timothy Mahone');
  replaceInSheet(values, 'TQU', 'Tom Quebec');

  // Write all updated values to the sheet, at once
  sheet.getDataRange().setValues(values);
}

function replaceInSheet(values, to_replace, replace_with) {
  //loop over the rows in the array
  for(var row in values){
    //use Array.map to execute a replace call on each of the cells in the row.
    var replaced_values = values[row].map(function(original_value) {
      return original_value.toString().replace(to_replace,replace_with);
    });

    //replace the original row values with the replaced values
    values[row] = replaced_values;
  }
}

尝试一下这段代码,如果您仍然遇到超时问题,我的建议是设置触发器来帮助链函数。

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

用于在 Google 表格中进行多次查找和替换的 Google Apps 脚本 的相关文章

随机推荐

  • 带分页的 Spring Data JPA 方法查询给我一个错误

    我正在使用 Spring Data Jpa 进行开发 我有一个接口扩展Jpa存储库 我想查询查询方式和寻呼 我要查询 从投票 我有一个简单的代码 该实体如下 Entity Table name cheat DynamicInsert Dyn
  • 如何使用 GitLab runner 启动服务并防止其停止?

    我将使用 GitLab CI 服务器部署简单的 Spring Boot 应用程序 我的 gitlab ci yml如下 stages build and test deploy web server build and test stage
  • Codeigniter - 获取当前路线

    我正在寻求帮助来了解我的 Codeigniter 应用程序经过哪条路线 在 config routes php 的应用程序文件夹中 我得到了一些数据库生成的路由 可能如下所示 route user any user profile 1 ro
  • 如何检查 Runtime.exec(cmd) 是否完成

    如何检查 Runtime exec cmd 是否完成 它正在运行 但如何检查 java 程序中的命令是否执行 如果我使用进程来检查 那么它会阻塞当前线程 如果我停止运行程序 则 Runtime exec cmd 正在执行 我应该怎么办 Th
  • 为什么我的处理器没有内置 BigInt 支持?

    据我了解 BigInts通常在大多数编程语言中实现为包含数字的数组 例如 当添加其中两个数字时 每个数字都会像我们在学校学到的那样被一个接一个地添加 例如 246 816 1062 其中 标记存在溢出 我在学校是这样学的 我实现的所有 Bi
  • 有没有好的J2ME IDE? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 韩语、Mac/Windows 系统字体

    关于显示韩文字体 当我使用时我注意到arial 它默认为sans serif 这在 Mac 和 Windows 上当然是不同的 我很难在 互联网 上找到有关此的信息 我希望这里有人能够告诉我一个可以在 Mac 和 Windows 上运行的韩
  • 隐藏客户端点击的div

    试图让这个 div 消失 似乎没有做我期望的事情 我哪里出错了 它不会消失 JavaScript
  • 未考虑 Google 自定义搜索 imgSize 和 imgType

    当我进行自定义搜索时 它会按预期返回图像和格式化的 JSON 唯一没有预料到并且没有考虑到的就是参数 imgType 照片 图像尺寸 小 这对谷歌来说没有什么区别 我仍然收到剪贴画图像和非常大的图像 在某些情况下大于 2500 像素 有任何
  • 重置区域分配器,分配仍然有效

    在我的带有 MKMapView 的 ViewController 被取消初始化后 我在 XCode 10 2 1 中收到以下消息 内存 重置区域分配器 其中 24 个分配仍然有效 我在 ViewController 中使用以下代码来清理 M
  • 如何在expo React Native App中将api级别29更改为30

    当我将应用程序包上传到 Play 商店时出现此消息 您的应用程序当前面向 API 级别 29 并且必须至少面向 API 级别 30 以确保它基于针对安全性和性能进行优化的最新 API 构建 将应用程序的目标 API 级别更改为至少 30 如
  • 检测WinRT和Windows 8之间的差异

    对于统计跟踪 我希望能够判断应用程序是在 Windows RT 还是 Windows Pro 上运行 该线程表示无法获取系统版本信息 在 WinRT Metro 应用程序 C 中获取操作系统版本 https stackoverflow co
  • Python:嵌套循环

    考虑一下 gt gt gt a one two bad good gt gt gt for i in a for x in i print x one two bad good 我该如何编写这段代码 但使用如下语法 for i in a p
  • 如何更改 Visual Studio 2012、2013 或 2015 许可证密钥?

    我的机器上有一份 Visual Studio 2012 Pro 的副本 带有一个序列号 但我不再使用它 因为我必须使用另一个序列号 我的问题是我一直卸载 Visual Studio 但重新安装后注册信息仍然存在 并且我无法弄清楚我必须删除哪
  • 使用反射和枚举进行 MVC 应用程序访问的逻辑控制是否安全?

    Trying to manage access to a web site I created some necessary entities 目标是为我的 MVC 应用程序的某些控制器的操作方法使用自定义权限属性 Permissions
  • redis:备份dump.rdb

    Context 我有一个正在运行的 redis 服务器 我想做一个备份 Idea 我想做以下事情 cp dump rdb some other location 06 24 2012 rdb Concern 我没有看到任何东西向我承诺 du
  • 使用 ExecutorService 时出现 CancellationException

    我想等待两个任务完成然后返回它们的结果 但有时我会收到此错误 为什么 CancellationException从哪里来 public class ShouldVoteTask extends AbstractWorkerTask
  • python -m 用于预提交

    pip3 install pre commit gt 已安装 我都试过了python3 m pre commit version and pre commit version 它说找不到模块 我正在使用 Pycharm 并从 Github
  • Appium - 创建会话 - 错误:应提供 JSONWP 或 W3C 功能

    我无法让 Appium 启动 Android 会话 并且在网上搜索时没有找到与我收到的错误消息相关的任何内容 当我运行测试时 Appium 转储此日志 debug MJSONWP Calling AppiumDriver createSes
  • 用于在 Google 表格中进行多次查找和替换的 Google Apps 脚本

    关于 Stack Exchange 的第一个问题 希望它有意义 一些背景 我在学校环境中工作 并协助学习支持人员为某些学生创建更易读的时间表 他们从我们的网站复制时间表数据 其中包含科目代码 教师姓名和房间号 它的格式与您在下图中看到的格式