web-dev-qa-db-ja.com

スプレッドシートへの複数の行の追加-Google Appsスクリプト

パフォーマンスと望ましくない可能性を考慮しながら、GASを介してGoogleシートに複数の行を追加したいと思います。

これを単一の行で実現するには、appendRowを使用します。これは、間にある突然変異の問題に取り組み、すべてのアクションを単一の関数で完了するためです。

簡単な例:

var sheet= SpreadsheetApp.openById(ssId).getSheetByName(sheetName);
sheet.appendRow(["foo", "bar", "foobar"]);

もちろん、これを複数の行に拡張するために、行ごとにこの関数を単純にループすることもできますが、GASのベストプラクティスでは、このような方法は推奨されません。

appendRowを使用して2D配列を介して複数の行を追加する試みは失敗し、APIが行に入る値として2次配列への参照を使用するようになりました。

したがって、appendRowが実行する介在する可変性に対処し、可能な場合にループを回避する、スプレッドシートに複数の行を追加する方法はありますか?

9
dbr

Sheet Class の公式ドキュメントを確認する必要があります。多数の行の挿入メソッドがリストされており、そのうちの1つが基準に合う可能性があります。それでも不十分な場合は、 Advanced Sheet Service を調べてください。

[〜#〜]編集[〜#〜]

あなたのコメントに応えて、純粋にアトミックな操作として行とデータを一括で追加する方法があるとは思いません。ただし、 LockService API を使用して、変更の介入に関する懸念に対処する方法があります。このサービスを使用すると、コードのブロックへの同時アクセスを防止できるため、ユースケースでは、一括挿入メソッドを利用して、変更を心配する必要なく、新しい行を作成してデータを入力できます。

2
Dimu Designs

編集:満足できない回答

その場合、あなたの答えは残念ながら私の基準を満たしていません。この方法では、行の作成とデータ挿入の間にシートが変更される可能性があります。 (つまり、誰かがデータを挿入する)。これを克服することは、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);
10

このコードスニペットの行と列の変数も必ず作成します。 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);
5
Colin Jameson