Google スプレッドシートによる Apps Script の基礎 #2: スプレッドシート、スプレッドシート、範囲

1. はじめに

「Google スプレッドシートを使用したアプリ スクリプトの基礎」再生リストのパート 2 へようこそ。これまでの Codelab では、スクリプト エディタ、マクロカスタム関数のコンセプトに焦点を当てていました。この Codelab では、Google スプレッドシート内のデータの読み取り、書き込み、操作に使用できるスプレッドシート サービスについて詳しく説明します。

学習内容

  • Apps Script でのスプレッドシート、シート、範囲の表現方法。
  • SpreadsheetApp クラスと Spreadsheet クラスを使用してアクティブな(開いている)スプレッドシートにアクセスし、作成、名前を変更する。
  • Sheet クラスを使用して、シートの名前と範囲や行の向きを変更する方法。
  • Range クラスを使用して、一連のセルまたはデータ範囲の指定、有効化、移動、並べ替えを行う方法。

始める前に

これは「Google スプレッドシートを用いた Apps Script の基礎」再生リストの 2 番目の Codelab です。始める前に、最初の Codelab(マクロとカスタム関数)を完了してください。

必要なもの

  • この再生リストの前の Codelab で説明した Apps Script の基本的なトピックについての理解。
  • Apps Script エディタの基本的な知識
  • Google スプレッドシートの基本事項
  • スプレッドシートの A1 表記を読む機能
  • JavaScript とその String クラスに関する基本的な知識

次のセクションでは、スプレッドシート サービスの主なクラスについて説明します。

2. スプレッドシート サービスの概要

スプレッドシート サービスの基盤には、SpreadsheetAppSpreadsheetSheetRange の 4 つのクラスがあります。このセクションでは、こうしたクラスとその使用目的について説明します。

SpreadsheetApp クラス

スプレッドシート、シート、範囲について詳しく説明する前に、親クラス SpreadsheetApp をご確認ください。多くのスクリプトは、Google スプレッドシート ファイルへの最初のアクセス ポイントを提供できるため、SpreadsheetApp メソッドを呼び出すことから始まります。SpreadsheetApp は、スプレッドシート サービスのメインクラスと考えることができます。SpreadsheetApp クラスについては、ここでは詳述しません。ただし、この Codelab の後半では、例と演習の両方について説明します。

スプレッドシート、シート、クラス

スプレッドシートとは、行と列ごとにまとめられたデータを含む Google スプレッドシート ファイル(Google ドライブに保存)です。スプレッドシートは「Google スプレッドシート」と呼ばれることがあり、ドキュメントは「Google ドキュメント」とも呼ばれます。

Spreadsheet クラスを使用すると、Google スプレッドシートのファイルデータにアクセスして変更できます。このクラスは、共同編集者の追加といった他のファイルレベルの操作にも使用できます。

f00cc1a9eb606f77.png

シート** は、スプレッドシートの個々のページ(「タブ」とも呼ばれます)を表します。各スプレッドシートには 1 つ以上のシートを含めることができます。Sheet** クラスを使用すると、シートレベルのデータや設定(データ行や列の移動など)にアクセスして変更することができます。

2016-0631

要約すると、Spreadsheet クラスは、シートのコレクションを操作し、Google ドライブ内の Google スプレッドシート ファイルを定義します。Sheet クラスは、スプレッドシート内の個々のシートに適用されます。

Range クラス

ほとんどのデータ操作操作(セルデータの読み取り、書き込み、書式設定など)では、操作を適用するセルを定義する必要があります。Range クラスを使用すると、シート内の特定のセルセットを選択できます。このクラスのインスタンスは範囲を表します。1 つのシート内の 1 つ以上の隣接するセルのグループです。範囲を指定するには、行番号と列番号、または A1 表記を使用します。

Codelab の残りの部分では、これらのクラスと連携するスクリプトの例とそのメソッドについて説明します。

3. 設定

続行する前に、データを含むスプレッドシートが必要です。データシートはお客様に提供されています。こちらのリンクをクリックしてデータシートをコピーし、[コピーを作成] をクリックしてください。

5376f721894b10d9.png

サンプル スプレッドシートは Google ドライブ フォルダにコピーされ、「無題のスプレッドシートのコピー」という名前でコピーされます。このスプレッドシートを使用して、この Codelab の演習を完了します。

スクリプト エディタは、[拡張機能] > [Apps Script] をクリックすれば開くことができます。

スクリプト エディタで Apps Script プロジェクトを初めて開くと、スクリプト プロジェクトとスクリプト ファイルの両方が作成されます。

次のセクションでは、Spreadsheet クラスを使用してこのスプレッドシートを改善する方法について説明します。

4. スプレッドシートへのアクセスと変更

このセクションでは、SpreadsheetApp クラスと Spreadsheet クラスを使用してスプレッドシートにアクセスし、変更する方法について説明します。具体的には、スプレッドシートの名前を変更する方法と、スプレッドシート内でシートを複製する方法について説明しています。

これらは単純なオペレーションですが、より大規模で複雑なワークフローの一部であることが多くあります。スクリプト コードを使用してこれらのタスクを自動化する方法を理解したら、より複雑な操作を自動化する方法を簡単に理解できるようになります。

有効なスプレッドシートの名前を変更する

デフォルトの「無題のスプレッドシートのコピー」をスプレッドシートの目的により適したタイトルに変更するとします。これは、SpreadsheetApp クラスと Spreadsheet クラスを使用して行うことができます。

  1. スクリプト エディタで、デフォルトの myFunction() コードブロックを次のコードに置き換えます。
function renameSpreadsheet() {
  var mySS = SpreadsheetApp.getActiveSpreadsheet();
  mySS.rename("2017 Avocado Prices in Portland, Seattle");
}
  1. スクリプトを保存するには [保存] save をクリックします。
  2. Apps Script プロジェクトの名前を変更するには、[無題のプロジェクト] をクリックし、新しいプロジェクト名として「Avocado price」と入力し、[名前を変更] をクリックします。
  3. スクリプトを実行するには、関数リストから renameSpreadsheet を選択し、[実行] をクリックします。
  4. 画面上の指示に沿ってマクロを承認します。「このアプリは確認されていません」というメッセージが表示された場合は、[詳細設定] をクリックしてから [アボカドの料金に移動(安全ではない)] をクリックします。次の画面で [許可] をクリックします。

関数が実行されると、スプレッドシートのファイル名が次のように変更されます。

226C7BC3C2FF33E.PNG

入力したコードを見てみましょう。getActiveSpreadsheet() メソッドは、有効なスプレッドシート、つまり作成したエクササイズ スプレッドシートのコピーを表すオブジェクトを返します。このスプレッドシート オブジェクトは mySS 変数に格納されています。mySSrename(newName) を呼び出すと、Google ドライブのスプレッドシート ファイルの名前が「2017 Avocado Prices in Portland, Seattle.」に変わります。

mySS 変数はスプレッドシートへの参照なので、getActiveSpreadsheet() を繰り返し呼び出すのではなく、mySSSpreadsheet メソッドを呼び出すことで、コードをよりクリーンかつ効率的にできます。

アクティブ シートを複製する

現在のスプレッドシートにはシートが 1 つしかありません。Spreadsheet.duplicateActiveSheet() メソッドを呼び出して、シートのコピーを作成できます。

  1. スクリプト プロジェクトにすでにある renameSpreadsheet() 関数の下に、次の新しい関数を追加します。
function duplicateAndOrganizeActiveSheet() {
  var mySS = SpreadsheetApp.getActiveSpreadsheet();
  var duplicateSheet = mySS.duplicateActiveSheet();
}
  1. スクリプト プロジェクトを保存します。
  2. スクリプトを実行するには、関数リストから duplicateAndOrganizeActiveSheet を選択し、[実行] をクリックします。

スプレッドシートに戻って「シートのオリジナルのコピー」シートをスプレッドシートに追加します。

d24f9f4ae20bf7d4.gif

この新しい関数では、duplicateActiveSheet() メソッドによってスプレッドシート内の重複するシートが作成され、有効になり、返されます。作成されたシートは duplicateSheet に保存されますが、コードはまだその変数を使用して何も行いません。

次のセクションでは、Sheet クラスを使用して複製したシートの名前を変更し、書式を設定します。

5. スプレッドシートのクラスを使ってシートを書式設定する

Sheet クラスには、スクリプトでシートを読み取り、更新できるようにするメソッドが用意されています。このセクションでは、Sheet クラスのメソッドを使用してシートの名前と列の幅を変更する方法について説明します。

シート名を変更する

シート名の変更は、renameSpreadsheet() でのスプレッドシート名の変更と同じように簡単です。必要なメソッドは 1 つだけです。

  1. Google スプレッドシートで Sheet_Original シートをクリックして有効にします。
  2. Apps Script で、duplicateAndOrganizeActiveSheet() 関数を次のように変更します。
function duplicateAndOrganizeActiveSheet() {
  var mySS = SpreadsheetApp.getActiveSpreadsheet();
  var duplicateSheet = mySS.duplicateActiveSheet();

  // Change the name of the new sheet.
  duplicateSheet.setName("Sheet_" + duplicateSheet.getSheetId());
}
  1. 関数を保存して実行します。

Google スプレッドシートで関数を実行すると、重複するシートが作成されて名前が変更されます。

91295f42354f62e7.gif

追加されたコードでは、setName(name) メソッドによって duplicateSheet の名前が変更され、getSheetID() を使用してシートの一意の ID 番号が取得されます。+ 演算子は、シート ID を "Sheet_" 文字列の末尾に連結します。

シートの列と行を変更する

Sheet クラスを使用してシートをフォーマットすることもできます。たとえば、duplicateAndOrganizeActiveSheet() 関数を更新して、重複シートの列のサイズを変更したり、固定行を追加したりできます。

  1. Google スプレッドシートで Sheet_Original シートをクリックして有効にします。
  2. Apps Script で、duplicateAndOrganizeActiveSheet() 関数を次のように変更します。
function duplicateAndOrganizeActiveSheet() {
  var mySS = SpreadsheetApp.getActiveSpreadsheet();
  var duplicateSheet = mySS.duplicateActiveSheet();

  // Change the name of the new sheet.
  duplicateSheet.setName("Sheet_" + duplicateSheet.getSheetId());

  // Format the new sheet.
  duplicateSheet.autoResizeColumns(1, 5);
  duplicateSheet.setFrozenRows(2);
}
  1. 関数を保存して実行します。

Google スプレッドシートでは、シートが複製、名前変更、有効化、書式設定された状態で複製されます。

2e57c917ab157dad.gif

追加したコードでは、読みやすくするために autoResizeColumns(startColumn, numColumns) を使用してシートの列のサイズを変更しています。setFrozenRows(rows) メソッドは、指定された数の行(この場合は 2 行)をフリーズします。これにより、リーダーがスプレッドシートを下方向にスクロールしたときに、ヘッダー行が表示されます。

次のセクションでは、範囲と基本的なデータ操作について学びます。

6. Range クラスを使用してデータを並べ替える

Range クラスとそのメソッドは、スプレッドシート サービスにおけるデータ操作と書式設定のオプションのほとんどを提供しています。

このセクションでは、範囲を使用した基本的なデータ操作について説明します。これらの演習では、Apps Script で範囲を活用する方法に焦点を当てています。また、この再生リストの他の Codelab では、データの操作とデータ形式について詳しく説明しています。

範囲を移動する

クラスメソッドと A1 表記を使用して、データ範囲を有効化して移動できます。これは、スプレッドシート内の特定のセルセットを識別する簡略表現です。内容について再確認するには、A1 表記の説明をご覧ください。

duplicateAndOrganizeActiveSheet() メソッドを更新して、次のデータも移動するようにしましょう。

  1. Google スプレッドシートで Sheet_Original シートをクリックして有効にします。
  2. Apps Script で、duplicateAndOrganizeActiveSheet() 関数を次のように変更します。
function duplicateAndOrganizeActiveSheet() {
  var mySS = SpreadsheetApp.getActiveSpreadsheet();
  var duplicateSheet = mySS.duplicateActiveSheet();

  // Change the name of the new sheet.
  duplicateSheet.setName("Sheet_" + duplicateSheet.getSheetId());

  // Format the new sheet.
  duplicateSheet.autoResizeColumns(1, 5);
  duplicateSheet.setFrozenRows(2);

  // Move column F to column C.
  var myRange = duplicateSheet.getRange("F2:F");
  myRange.moveTo(duplicateSheet.getRange("C2"));
}
  1. 関数を保存して実行します。

この関数を実行すると、重複するシートが作成され、有効化され、書式設定されます。F 列の内容は C 列に移動します。

10ea483aec52457e.gif

新しいコードは、getRange(a1Notation) メソッドを使用して、移動するデータの範囲を識別します。A1 表記(F2:F)を入力することで、メソッドのパラメータとして列 F を指定します(F1 は除く)。指定された範囲が存在する場合、getRange(a1Notation) メソッドはその Range インスタンスを返します。このコードでは、使いやすいようにインスタンスを myRange 変数に格納しています。

範囲を特定したら、moveTo(target) メソッドは myRange の内容(値と形式の両方)を取得して移動します。デスティネーション(列 C)は、A1 表記「C2」を使用して指定します。これは列ではなく 1 つのセルです。データを移動するときは、サイズをターゲット範囲と宛先範囲と一致させる必要はありません。Apps Script は、それぞれ最初のセルを整列させます。

範囲を並べ替え

Range クラスを使用すると、セルグループの読み取り、更新、整理を行えます。たとえば、Range.sort(sortSpecObj) メソッドを使用してデータ範囲を並べ替えることができます。

  1. Google スプレッドシートで Sheet_Original シートをクリックして有効にします。
  2. Apps Script で、duplicateAndOrganizeActiveSheet() 関数を次のように変更します。
function duplicateAndOrganizeActiveSheet() {
  var mySS = SpreadsheetApp.getActiveSpreadsheet();
  var duplicateSheet = mySS.duplicateActiveSheet();

  // Change the name of the new sheet.
  duplicateSheet.setName("Sheet_" + duplicateSheet.getSheetId());

  // Format the new sheet.
  duplicateSheet.autoResizeColumns(1, 5);
  duplicateSheet.setFrozenRows(2);

  // Move column F to column C.
  var myRange = duplicateSheet.getRange("F2:F");
  myRange.moveTo(duplicateSheet.getRange("C2"));

  // Sort all the data using column C (Price information).
  myRange = duplicateSheet.getRange("A3:D55");
  myRange.sort(3);
}
  1. 関数を保存して実行します。

この関数では、以前の形式に加えて、列 C の価格情報を使用してテーブル内のすべてのデータを並べ替えます。

a6cc9710245fae8d.png

新しいコードでは、A3:D55(列見出しを除くテーブル全体)を含む新しい範囲が getRange(a1Notation) で指定されています。次に、テーブルを並べ替えるために sort(sortSpecObj) メソッドを呼び出します。ここで、sortSpecObj パラメータは並べ替えの基準となる列番号です。このメソッドは、表示された列の値が昇順(昇順)になるよう範囲を並べ替えます。sort(sortSpecObj) メソッドを使用すると、複雑な並べ替え要件を指定できますが、ここでは必要ありません。並べ替え範囲を呼び出すためのさまざまな方法については、メソッド リファレンス ドキュメントをご覧ください。

お疲れさまでした。Codelab のすべての演習を完了しました。次のセクションでは、この Codelab の重要ポイントを確認し、この再生リストの次の Codelab をプレビューします。

7. おわりに

この Codelab は以上です。Apps Script で スプレッドシート サービス の基本的なクラスと用語を使用および定義できるようになりました。

次の Codelab に進む準備が整いました。

この Codelab はお役に立ちましたか。

はい いいえ

学習した内容

次のステップ

この再生リストの次の Codelab では、スプレッドシート内のデータの読み取り、書き込み、変更方法について詳しく説明します。

次の Codelab はデータの操作で確認できます。