[英]Google Apps Script for Multiple Find and Replace in Google Sheets
Very first question on Stack Exchange so hopefully it makes sense.关于 Stack Exchange 的第一个问题,希望它有意义。
Some background: I work in a school environment and am assisting Learning Support staff in creating more readable timetables for certain students.一些背景:我在学校环境中工作,正在协助学习支持人员为某些学生创建更易读的时间表。
They are copying the timetable data from our website which contains subject codes, teacher names, and room numbers.他们从我们的网站上复制时间表数据,其中包含科目代码、教师姓名和房间号。 It is in the exact same format that you see in the image below - I have simply copied it into Google Sheets.
它与您在下图中看到的格式完全相同 - 我只是将其复制到 Google 表格中。
I essentially need to perform a bulk find and replace for all these codes, and expand them fully so that a subject code eg 01ENG02 becomes 'English' and a teachers code eg JBO becomes "Joe Bloggs"我基本上需要对所有这些代码执行批量查找和替换,并完全扩展它们,以便主题代码(例如 01ENG02 变为“英语”,教师代码(例如 JBO)变为“Joe Bloggs”
I have a full list of what I need the codes to expand to - it's just how best to implement this.我有一个完整的列表,列出了我需要将代码扩展到什么——这就是实现它的最佳方式。
Here is some Google Scripts code in which I've found on both Stack Exchange and other sites which I'm using:这是我在 Stack Exchange 和我正在使用的其他网站上找到的一些 Google Scripts 代码:
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);
}
This works perfectly.这非常有效。 However, I have over 150 staff names, and roughly the same number of subject codes.
但是,我有 150 多个员工姓名,以及大致相同数量的主题代码。 The process reaches the maximum time, and I'm sure there's got to be a better way of coding this.
这个过程达到了最长时间,我相信一定有更好的编码方式。
I'll consider alternative methods, just bear in mind it needs to be as straightforward as possible for the staff who will be using it.我会考虑其他方法,请记住,对于将要使用它的员工来说,它需要尽可能简单明了。
Each time you call getValues
and setValues
in your script there is a considerable overhead cost involved and slows your script down.每次在脚本中调用
getValues
和setValues
时,都会涉及相当大的开销成本,并且会减慢脚本速度。 ( Google app script timeout ~ 5 minutes? ) I modified your above script to make that 1 call for getValues
and 1 Call to setValues
. ( Google 应用程序脚本超时 ~ 5 分钟? )我修改了您上面的脚本,使 1 次调用
getValues
和 1 次调用setValues
。 The code applies all the replacement to the array in memory before pasting your modified timetable back to the sheet.在将修改后的时间表粘贴回工作表之前,代码将所有替换应用于内存中的数组。
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;
}
}
Give this code a try, if you still have issues with timeouts, my suggestion is setup triggers to help chain functions.试试这段代码,如果您仍然遇到超时问题,我的建议是设置触发器以帮助链接函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.