↓こんな感じでどうでしょうか?
javascript
1function sample() {
2var sheet = SpreadsheetApp.getActiveSheet()
3 var values = sheet.getDataRange().getValues();
4
5 for(var idx in values){
6 if(values[idx][4] === 0) {values[idx][4] = "";}
7 if(values[idx][5] === 0) {values[idx][5] = "";}
8 if(values[idx][6] === 0) {values[idx][6] = "";}
9 }
10 sheet.getDataRange().setValues(values);
11}
勉強する方のようなので説明を。
GoogleAppScriptは、APIコールが遅いです("APIコール"は、SpreadsheetAppみたいにxxxAppを使うものです。getRangeとか、getValueとかも、sheet由来なのでAPIです)。
これはそういうものなので、回避策として、最初に欲しいデータをごっそり取ってきて、それを加工して、まとめて戻す、という方法を使います。
例えば、あなた自身がトライした方法でいうと、行数かける3倍から6倍の回数分だけ、APIコールをしていますが、↑であげたのだと行数に関係なくgetValuesとsetValuesを1回ずつしかしていません。
なので、スプレッドシートを使うなら、javascriptの配列と仲良くなってください。
** var values = sheet.getDataRange().getValues();
データが入っている領域を表としてまとめてとってくる処理です。Lastとかを考えなくてもやってくれる便利機能です。
表なので縦の行数x横の列数の2次元配列になっています。
** for(var idx in values)
行数が何番目かを取り出してます。ちなみに配列は0番目からはじまります。何からはじまるかとか考えるとミスのもとなので、inで取り出してます(for(var i = 0; i < values.length ; i++)
とはしなかったということです。var i = 1とか、i <= values.lengthとかしちゃうとバグります)
** if(values[idx][4] === 0) {values[idx][4] = "";}
idx行目の4列目(0はじまりなので、Eは4列目になります)が何かを判定して→書き込みの流れ。
"4"とか書くのはよくないですが、var e = values[idx][4]; if(e === -1) e = "";
ってやってもだめです。valuesを書き換える必要があります。
(var ColE = 4;values[idx][ColE] = "";
とかするとマシかもしれない)
** sheet.getDataRange().setValues(values);
まとめて戻しています。ただし、表のかたちが同じ(二次元配列であること。表のサイズが違ってたらどうなるか未確認)でないといけません。ここでは取り出したvaluesを戻しているので、かたちは同じはず。
形がそろってれば、大きな表でも一気にセットできる便利機能です。
** replaceについて
どの機能のことかわかりませんでした。文字列のreplaceの話であればここではあまり速度には貢献しないと思います。
追記
javascript
1function sample() {
2var sheet = SpreadsheetApp.getActiveSheet()
3 var values = sheet.getRange(1, 5, 100,3).getValues();
4
5 for(var idx in values){
6 if(values[idx][0] == -1) {values[idx][0] = "";}
7 if(values[idx][1] == -1) {values[idx][1] = "";}
8 if(values[idx][2] == -1) {values[idx][2] = "";}
9 }
10 sheet.getRange(1, 5, 100,3).setValues(values);
11}