0

私がしようとしているのは、スプレッドシートのすべての列のサイズを変更することです。これはスタンドアロンのスプレッドシートです。私が使用しています:私はそれを引き起こしているのか分からないという理由だけで、私は両方for (var i = columns; i >= 1; i--)for (var i = 1; i <= columns; i++)を試してみたautoResizeColumn()ループがGoogle Appsスクリプトをフリーズしているように見えるのはなぜですか?

function format() { 
    var destination = SpreadsheetApp 
    .openByUrl("https://docs.google.com/spreadsheets/d/spreadsheetIdHere/edit#gid=0") 
    .getSheetByName("sheetName"); 
    var columns = destination.getMaxColumns(); 
    destination.setFrozenRows(1); 
    destination.setFrozenColumns(3); 
    for (var i = columns; i >= 1; i--) { 
    Logger.log(i) 
    destination.autoResizeColumn(i); 
    } 
} 

。私は無限ループを想定していましたが、ループを完全に削除しましたが、それはあまりにも長く実行されます。

ログは、私がautoResize ...をコメントアウトして約1秒後に予想される結果を生成します。 autoResizeを戻してください。スクリプトは実行されて実行され、列も変更されません。

私はループを取り出して、autoResizeColumn(227)に単一の数字を入れてみました。ループを戻して、私は立ち往生しています。

autoResizeColums()が遅すぎるか、何か不足していますか?

詳細情報が必要な場合はお知らせください。

+0

を使用してユーザープロパティを書き込むのに9秒です。getMaxColumn()の代わりにgetLastColumn()を使用してみてください。 getLastColumn()はデータが格納されている最後の列のインデックスを返します。getMaxColumn()は、ユーザーが出席者表の合計列数のインデックスを示します。 標準のグーグルスプレッドシートの最大カラム数は256です。 –

答えて

0

パート1

質問者:

、スクリプトは単に実行し、実行し、さらに任意の列を変更しません。 flush()から

は:

スプレッドシート操作は時々そのようなRange.getValueに複数の呼び出しを行うときに、パフォーマンスを向上させるために一緒に束ねられています()。

スクリプトが終了する前にスプレッドシートに加えられた変更を確認するには、SpreadshsheetApp.flush()を追加する必要があります。ループ内に追加することは公式文書の悪い習慣の例で言及されています。

Best practices

パート2

質問者:

はautoResizeColums()だけ遅すぎる、または私は何かが足りないのですか?

一般に、SpreadsheetAppや他の同様のサービスの呼び出しは非常に遅いです。私の経験では、私が見た最も遅い呼び出しは、Properties Service

+1

それは私がflush()を追加しなかった理由です。私はそれを見る必要はありません、私はちょうどそれが完了するのにかかる時間にショックを受けました。 –

+0

あなたの質問にそれを含めてください。 –

関連する問題