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

1. はじめに

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

学習内容

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

始める前に

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

必要なもの

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

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

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

スプレッドシート サービスの基盤となる 4 つのクラスは、SpreadsheetAppSpreadsheetSheetRange です。このセクションでは、これらのクラスとその用途について説明します。

SpreadsheetApp クラス

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

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

スプレッドシートという用語は、行と列で整理されたデータを含む Google スプレッドシート ファイル(Google ドライブに保存)を指します。スプレッドシートは、ドキュメントが「Google ドキュメント」と呼ばれるのと同じように、「Google スプレッドシート」と呼ばれることもあります。

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

f00cc1a9eb606f77.png

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

39dbb10f83e3082.png

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

Range クラス

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

この Codelab の残りの部分では、これらのクラスとそのメソッドを使用するスクリプトの例を示します。

3. セットアップ

続行する前に、データを含むスプレッドシートが必要です。Google が用意したデータシートをご利用いただけます。このリンクをクリックしてデータシートをコピーし、[コピーを作成] をクリックしてください。

5376f721894b10d9.png

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

スクリプト エディタは、Google スプレッドシートで [拡張機能] > [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. スクリプトを保存するには、[保存] 保存 をクリックします。
  2. Apps Script プロジェクトの名前を変更するには、[無題のプロジェクト] をクリックし、新しいプロジェクト名として「アボカドの価格」と入力して、[名前を変更] をクリックします。
  3. スクリプトを実行するには、関数リストから renameSpreadsheet を選択して [実行] をクリックします。
  4. 画面上の指示に沿って操作し、マクロを承認します。「このアプリは確認されていません」というメッセージが表示された場合は、[詳細] をクリックし、[アボカドの価格(安全ではないページ)に移動] をクリックします。次の画面で [許可] をクリックします。

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

226c7bc3c2fbf33e.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 を選択して [実行] をクリックします。

スプレッドシートに「Sheet_Original のコピー」という新しいシートタブが追加されていることを確認します。

d24f9f4ae20bf7d4.gif

この新しい関数では、duplicateActiveSheet() メソッドがスプレッドシートの複製シートを作成、有効化して返します。この結果のシートは duplicateSheet に保存されますが、コードではまだこの変数を使用していません。

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

5. Sheet クラスを使用してシートの形式を設定する

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 クラスとそのメソッドは、スプレッドシート サービスのデータ操作と書式設定のオプションのほとんどを提供します。

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

範囲を移動する

クラスメソッドと A1 形式(スプレッドシート内の特定のセルセットを識別するための略記法)を使用して、データの範囲を有効にして移動できます。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」で指定されています。これは列ではなく、単一のセルです。データを移動するときに、サイズをターゲット範囲と宛先範囲に一致させる必要はありません。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

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

お疲れさまでした。これで、この Codelab のすべての演習が完了しました。次のセクションでは、この Codelab の要点を確認し、このプレイリストの次の Codelab を紹介します。

7. まとめ

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

これで、次の Codelab に進む準備が整いました。

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

はい いいえ

学習した内容

  • Apps Script でスプレッドシート、シート、範囲がどのように表されるか。
  • SpreadsheetAppSpreadsheetSheetRange クラスの基本的な使用方法。

次のステップ

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

次の Codelab は、データの操作で確認してください。