パフォーマンスと望ましくない可能性を考慮しながら、GASを介してGoogleシートに複数の行を追加したいと思います。
これを単一の行で実現するには、appendRow
を使用します。これは、間にある突然変異の問題に取り組み、すべてのアクションを単一の関数で完了するためです。
簡単な例:
var sheet= SpreadsheetApp.openById(ssId).getSheetByName(sheetName);
sheet.appendRow(["foo", "bar", "foobar"]);
もちろん、これを複数の行に拡張するために、行ごとにこの関数を単純にループすることもできますが、GASのベストプラクティスでは、このような方法は推奨されません。
appendRow
を使用して2D配列を介して複数の行を追加する試みは失敗し、APIが行に入る値として2次配列への参照を使用するようになりました。
したがって、appendRow
が実行する介在する可変性に対処し、可能な場合にループを回避する、スプレッドシートに複数の行を追加する方法はありますか?
Sheet Class の公式ドキュメントを確認する必要があります。多数の行の挿入メソッドがリストされており、そのうちの1つが基準に合う可能性があります。それでも不十分な場合は、 Advanced Sheet Service を調べてください。
[〜#〜]編集[〜#〜]
あなたのコメントに応えて、純粋にアトミックな操作として行とデータを一括で追加する方法があるとは思いません。ただし、 LockService API を使用して、変更の介入に関する懸念に対処する方法があります。このサービスを使用すると、コードのブロックへの同時アクセスを防止できるため、ユースケースでは、一括挿入メソッドを利用して、変更を心配する必要なく、新しい行を作成してデータを入力できます。
編集:満足できない回答
その場合、あなたの答えは残念ながら私の基準を満たしていません。この方法では、行の作成とデータ挿入の間にシートが変更される可能性があります。 (つまり、誰かがデータを挿入する)。これを克服することは、appendRowの重要なボーナスです。
元の答え:
値を一度に設定する Range.setValues() メソッドを使用できます。適切な範囲(配列の長さ)と適切な位置( sheet.getLastRow() +1メソッドを使用)を取得するだけです。次に例を示します。
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var example = [[1,2,3],[4,5,6],[7,8,9]];
sheet.getRange(sheet.getLastRow()+1, 1, example.length, example[0].length).setValues(example);
このコードスニペットの行と列の変数も必ず作成します。 getrange関数に直接object.lengthを追加しようとすると、GASがエラーをスローすることがあります。つまり.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var example = [[1,2,3],[4,5,6],[7,8,9]];
var row = example.length;
var column = example[0].length;
sheet.getRange(sheet.getLastRow()+1, 1, row, column).setValues(example);