2017-09-01 6 views
1

この赤い電球のメッセージは、実行するたびにシートスクリプトエディタで表示されます。コードに何か問題がありますか?それはうまくいくと思われ、実行するのに非常に時間がかかりません。赤い電球の警告

方法Range.getValueが重くスクリプトが高価と考えられている方法を使用するスクリプト

で使用されています。呼び出しごとに、リモートサーバーへの時間のかかる呼び出しが生成されます。これは、スクリプトの実行時間、特に大規模なデータに重大な影響を与える可能性があります。パフォーマンスがスクリプトの問題である場合は、別の方法、たとえばRange.getValues()

function Merge() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('Expense Index'); 
    var lastrow=sheet.getLastRow(); 
    var range = sheet.getRange("A1:F"+(lastrow+1)); 
var k=3; 

    for (var i = 4; i <=lastrow+1; i++) { 
    var val1=range.getCell(i-1, 1).getValue(); 
    var val2=range.getCell(i, 1).getValue(); 

    if(val1!==val2){ 
    if(!(sheet.getRange('A'+k+':A'+(i-1)).isPartOfMerge())){ 
    sheet.getRange('A'+k+':A'+(i-1)).mergeVertically(); 
    range.getCell((i-1), 6).setValue('=SUM(E'+k+':E'+(i-1)+')'); 
    } 
    k=i; 
    } 
} 
sheet.getRange("A1:F"+(lastrow+1)).setHorizontalAlignment('center'); 
sheet.getRange("A1:F"+(lastrow+1)).setVerticalAlignment('middle') 
} 

答えて

0

のGoogle Apps Scriptが開発チームが推奨するbest practicesを持っています。リピート・レンジ・コールを行うことは、運用コストが高い。範囲データをバッチし、返されるObjectを反復処理する方がはるかに優れています。

今は、各ループに2つのオブジェクトを要求しています。すべてのデータを単一のオブジェクトとして取得する方が効率的です。だから、変更:

ブラケット表記法を使用してオブジェクトを介し
// range.getValues() returns a 2D array you can loop through in one call. 
var range = sheet.getRange("A1:F"+(lastrow+1)).getValues(); 

ループに

var range = sheet.getRange("A1:F"+(lastrow+1)); 

+0

合計noobのは、私がどのようにオブジェクトをループに把握することができないよう、私は物事の束を試してみましたが、より多くの場合より、このエラーを取得しました。 TypeError:オブジェクト内にgetCell関数が見つかりませんExpense –

+0

シートはどのように設定されていますか?私はサンプルループを手助けするために更新することができます。 – Brian

+0

https://drive.google.com/open?id=1MUguO4w6CkeuOGToFBGffCKFV8skVt0FlKe7yCzip4A –