我想创建一个需要查找某个字符串并自动替换它的脚本。我已设法做到这一点,但需要超过1分钟才能查看所有行和列。
这就是我现在正在做的事情:
for (i=1; i<=rows; i++) {
for (j=1; j<=cols; j++) {
cell = content.getCell(i, j).getValue();
if (content.getCell(i, j).getFormula()) {continue;}
try {
cell = cell.replace (find, replace);
content.getCell(i, j).setValue(cell);
}
catch (err) {continue;}
}
}
内置方法可立即替换文本,因此我认为有更好的方法可以解决这个问题。有什么想法吗?
答案 0 :(得分:0)
不是逐个从工作表中检索每个单元格,而是使用getDataRange()和getValues()在一次调用中获取数组中的所有数据,然后在数组上执行搜索。
然后,根据您是否可以在运行脚本的同时编辑实时用户,您可以替换数组中的值并使用setValues()重写整个工作表,也可以使用setValue()用于逐个更新具有匹配项的特定单元格。
请参阅: https://developers.google.com/apps-script/reference/spreadsheet/sheet#getdatarange
https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues
答案 1 :(得分:0)
试试这个......
for (i=1; i<=rows; i++) {
for (j=1; j<=cols; j++) {
cellLoc = content.getCell(i, j);
cellValue = cellLoc.getValue();
if (cellLoc.getFormula()) {continue;}
try {
cellValue = cellValue.replace (find, replace);
cellLoc.setValue(cell);
}
catch (err) {continue;}
}
}
我取消了content.getCell(i,j)
的每个实例,而是将其存储到cellLoc中。这样每次你需要content.getCell(i,j)
时,程序就不必在内容中找到单元格,它只能看看cellLoc的值是什么。让我知道它是否有效以及时间是否有所改善......
答案 2 :(得分:0)
嗯,我没有看到这种方法与我的第一种方法有很大区别,但它现在立即取代所有比赛:
function findReplace() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getDataRange();
var values = range.getValues();
var i, j, find, replace;
find = "hello";
replace = "bravo!!";
for (i = 0; i < values.length; i++) { //Run through all rows
for (j = 0; j < values[i].length; j++) { //Run through all columns
if (values[i][j] == find){
values[i][j] = replace;
}
}
}
range.setValues(values);
}