我正在尝试让此功能在电子表格上运行,并找不到所有撇号并替换所有撇号。现在它可以工作,但它需要很长时间,现在我的电子表格中有12行,只需要128秒即可运行。我想尝试做的只是在电子表格的最后一行激活。
我尝试通过添加var row = r.getLastRow();
并更改几个点以使用行来使其工作。当我这样做时,我无法让它运行。我将在每次提交表单时运行它,因此它应该始终是最后一行。
我从以下代码获得了代码:https://productforums.google.com/d/msg/docs/7IlOotksJ4I/liXa0SrC-R4J
function fandr() {
var r=SpreadsheetApp.getActiveSheet().getDataRange();
var rws=r.getNumRows();
var cls=r.getNumColumns();
var i,j,a,find,repl;
find="'";
repl="";
for (i=1;i<=rws;i++) {
for (j=1;j<=cls;j++) {
a=r.getCell(i, j).getValue();
if (r.getCell(i,j).getFormula()) {continue;}
try {
a=a.replace(find,repl);
r.getCell(i, j).setValue(a);
}
catch (err) {continue;}
}
}
}
答案 0 :(得分:1)
我遇到了同样的性能问题,并发现Google在处理多个单元格时鼓励getValues
超过getValue
。你得到一个带有getValues
的二维数组。见https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues
答案 1 :(得分:1)
在我看来,用脚本替换文本的最佳方法是使用map
。 @ serge-insas here建议使用此功能。您可以对其进行修改以获得最佳性能结果,并仅替换最后一行值:
function testReplaceInRange(){
var sheet = SpreadsheetApp.getActiveSheet()
var lastRow = sheet.getLastRow();
var DataRange = sheet.getDataRange();
var range = DataRange.offset(lastRow - 1, 0, 1); // last Data row
replaceInRange(range,"'","");
}
function replaceInRange(range, to_replace, replace_with) {
//get the current data range values as an array
var values = range.getValues();
// make RegExp
var Rep = new RegExp(to_replace, 'g');
//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(Rep,replace_with);
});
//replace the original row values with the replaced values
values[row] = replaced_values;
}
//write the updated values to the range
range.setValues(values);
}
我还使用了正则表达式的trich,由@ cory-gross here建议。它的目的是替换所有to_replace
文本,而不仅仅是第一个。httpd.conf
文本。