私の理解が正しければ、新しい行をシートに追加し、列の既存の検証を維持する関数をスクリプト化する必要があります。これは確かに可能であり、それほど難しくありません。1 つのアプローチは、他のシートで再利用したい場合にシート全体を一度に更新する「検証の更新」機能です。ただし、最初に、基本的な Google Apps スクリプトを実行するために知っておく必要があるオブジェクト クラスの簡単な概要を使用できるように思えます。
- SpreadsheetApp - このクラスは、スプレッドシート サービスの基盤と考えてください。UI やデータ検証セットの作成など、特定のスプレッドシート自体に関連付けられていないファイル I/O と機能を提供します。これは、個々のスプレッドシート ドキュメントすべてへのインターフェイスです。
- スプレッドシート- 複数のシートを含むことができるスプレッドシート ドキュメント ファイル。これは、ドライブで新しい Google スプレッドシート ドキュメントを作成するときに作成されるものです。所有権の管理、アクセス許可の設定、メタデータへのアクセスなど、ドキュメント レベルの機能を提供します。Sheet クラスと重複する部分があるため、これはごちゃ混ぜのように思えるかもしれません。
- シート- 個々のシートは、通常スプレッドシートと考えられるもので、行と列のセットです。各スプレッドシート ドキュメントには、多数の個別のシートを含めることができます。Sheet クラスを使用すると、シートの全体的な外観を変更できます。行をフリーズまたは非表示にしたり、セルの範囲を編集できないように保護したり、行や列を追加/削除したりできます。コンテンツを含む最後の行やシート全体の最大範囲など、シートに関するデータを取得することもできます。
- 範囲- 別のレベルを下にドロップすると、セルの特定の長方形の領域を表す Range オブジェクトに到達します。これは、1 つのセルのように小さくすることも、シート全体と同じように大きくすることもできます。ただし、Ranges で不連続なセルを表すことはできないようです。Range オブジェクトをコピーしてシートに貼り付けることができるコンテンツとして扱ったため、ここで問題が発生しました。これは理解できます。ただし、Range はそれが表すセル内のデータではありません。それはそれらの細胞への単なるインターフェースです。データ自体にアクセスする場合は、階層の最下位レベルにドロップダウンする必要があります。
- 値 - シートの実際の内容は、Google Apps Script がサポートする JavaScript のサブセットで操作できる通常の JavaScript 値 (文字列、整数、ブール値など) です。
シート内の値で何かを行うには、最初に Sheet から Range オブジェクトを取得し (これは SpreadsheetApp から取得します)、次に Range から値を取得します。
var values = SpreadsheetApp.getActiveSheet().getRange("A1:B1").getValues(); // returns [[]]
getValues() は多次元配列を返すことに注意してください。シートの値を表すと、次のようになります。
// row 1 [[column A, column B, column C, column D, ...],
// row 2 [column A, column B, column C, column D, ...],
// row 3 [column A, column B, column C, column D, ...],
// row 4 [column A, column B, column C, column D, ...],
// row 5 [column A, column B, column C, column D, ...], ...]
ですのでA1:B1の範囲が1行2列の範囲であれば、A1表記で値を取得するか、範囲の左上の行と列を指定して、取得したい行数と列数を指定することで値を取得できます。取得:
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("A1:B1");
var range = sheet.getRange(1, 1, 1, 2); // row 1, column 1, 1 row, 2 columns
var values = range.getValues(); // returns [[50, 100]]
A1 の値が 50 で、B1 の値が 100 の場合、上記の最後の関数は を返し[[50, 100]]
ます。個々のセル値に直接アクセスすることもできます:
var range = sheet.getRange("A1");
var value = range.getValue(); // returns 50
var cell = range.getCell().getValues(); // returns [[50]]
もちろん、範囲の値も設定できます。
var range = sheet.getRange("A1:B2");
range.setValues([[50, 100]]);
range = sheet.getRange(1, 1); // same as sheet.getCell(1, 1)
range.setValue(50); // the value of A1, or row 1 column 1, is now 50
次のステップは、 Data Validationクラスがどのように機能するかを理解することです。Data Validation Builderを使用して Data Validation オブジェクトを作成します。これにより、一連のルールを連結して範囲に適用できます。次に、範囲をそのデータ検証ルール セットに設定します。
var stateList = ["AK", "AL", "AR", ...];
var rules = SpreadsheetApp.newDataValidation() // create a new Data Validation Builder object and use method chaining to add rules to it
.requireValueInList(stateList, true) // first param is the list of values to require, second is true if you want to display a drop down menu, false otherwise
.setAllowInvalid(false) // true if other values are allowed, false otherwise
.setHelpText("Enter a state") // help text when user hovers over the cell
.build();
range.setDataValidation(rules); // apply the rules to a range
行を挿入すると、ルールが自動的にコピーされます。
var lastRow = sheet.getLastRow(); // get the last row that contains any content
sheet.insertRowAfter(lastRow);
または、ルールをコピーして別の場所で使用します。
var cell = sheet.getRange(1, 1, 1, 1);
var rule = sheet.getDataValidation(); // returns rule
var range = sheet.getRange("A1:B1");
var rules = range.getDataValidations(); // returns [[rules, rules]]
var lastRow = sheet.getLastRow(); // or sheet.getMaxRows()
range.setDataValidations(rules);
したがって、これらの概念を非常に簡単に組み合わせて、行の追加、検証ルール セットの構築、新しいセル範囲への検証の追加に必要な関数を記述することができます。これらのことのほとんどは、私がここで説明するよりも簡潔に行うことができますが、より詳細な説明を探しているようです。お役に立てば幸いです。