JavaのGoogleスプレッドシートとやり取りする

1概要

Googleスプレッドシートを使用すると、スプレッドシートを保存して操作したり、ドキュメント上で他のユーザーと共同作業したりすることができます。

場合によっては、自動化された操作を実行するなど、アプリケーションからこれらの文書にアクセスすると便利なことがあります。この目的のために、Googleは開発者がやり取りできるGoogle Sheets APIを提供しています。

この記事では、APIに接続してGoogle Sheetsで操作を実行する方法について説明します。

2 Mavenの依存関係

APIに接続してドキュメントを操作するには、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22google-api-client%22%20AND%20gを追加する必要があります。 %3A%22com.google.api-client%22[google-api-client]、https://search.maven.org/classic/#search%7Cga%7C1%7Cgoogle%20oauth%20client%20jetty[google-oauth]-client-jetty]およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Cgoogle%20api%20services%20sheets[google-api-services-sheets]依存関係:

<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.23.0</version>
</dependency>
<dependency>
    <groupId>com.google.oauth-client</groupId>
    <artifactId>google-oauth-client-jetty</artifactId>
    <version>1.23.0</version>
</dependency>
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-sheets</artifactId>
    <version>v4-rev493-1.23.0</version>
</dependency>

3承認

  • Google Sheets APIには、アプリケーションからアクセスする前にOAuth 2.0認証が必要です。

まず、一連のOAuth認証情報を取得してから、これをアプリケーションで使用して承認要求を送信する必要があります。

3.1. OAuth 2.0認証情報を取得する

認証情報を取得するには、https://console.developers.google.com[Google Developers Console]でプロジェクトを作成し、そのプロジェクトのGoogle Sheets APIを有効にする必要があります。 Googleクイックスタート ガイドの最初の手順には、これを行う方法の詳細が記載されています。

認証情報を含むJSONファイルをダウンロードしたら、アプリケーションの src/main/resources ディレクトリにある google-sheets-client-secret.json ファイルの内容をコピーします。

ファイルの内容は次のようになります。

{
  "installed":
    {
      "client__id":"<your__client__id>",
      "project__id":"decisive-octane-187810",
      "auth__uri":"https://accounts.google.com/o/oauth2/auth",
      "token__uri":"https://accounts.google.com/o/oauth2/token",
      "auth__provider__x509__cert__url":"https://www.googleapis.com/oauth2/v1/certs",
      "client__secret":"<your__client__secret>",
      "redirect__uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]    }
}

3.2. Credential オブジェクトを取得する

  • 認証が成功すると、Google Sheets APIと対話するために使用できる Credential オブジェクトが返されます。**

上記のJSONファイルの内容を読み取り、 GoogleClientSecrets オブジェクトを構築する静的な authorize() メソッドを使用して GoogleAuthorizeUtil クラスを作成しましょう。

次に、 GoogleAuthorizationCodeFlow を作成して承認リクエストを送信します。

public class GoogleAuthorizeUtil {
    public static Credential authorize() throws IOException, GeneralSecurityException {

       //build GoogleClientSecrets from JSON file

        List<String> scopes = Arrays.asList(SheetsScopes.SPREADSHEETS);

       //build Credential object

        return credential;
    }
}

この例では、Googleスプレッドシートにアクセスし、受信した認証情報を格納するためにインメモリの DataStoreFactory を使用するため、 SPREADSHEETS スコープを設定します。もう1つの選択肢は、 FileDataStoreFactory を使用して資格情報をファイルに格納することです。

GoogleAuthorizeUtil cla____ssの完全なソースコードについては、https://github.com/eugenp/tutorials/tree/master/libraries[GitHubプロジェクト]をご覧ください。

4 Sheets サービスインスタンスの構築

Googleスプレッドシートと対話するには、** APIを通じて読み書きするためのクライアントである Sheets オブジェクトが必要です。

上記の Credential オブジェクトを使用して Sheetsのインスタンスを取得する SheetsServiceUtil__クラスを作成しましょう。

public class SheetsServiceUtil {
    private static final String APPLICATION__NAME = "Google Sheets Example";

    public static Sheets getSheetsService() throws IOException, GeneralSecurityException {
        Credential credential = GoogleAuthorizeUtil.authorize();
        return new Sheets.Builder(
          GoogleNetHttpTransport.newTrustedTransport(),
          JacksonFactory.getDefaultInstance(), credential)
          .setApplicationName(APPLICATION__NAME)
          .build();
    }
}

次に、APIを使用して実行できる最も一般的な操作のいくつかを見てみましょう。

5シートに値を書き込む

既存のスプレッドシートと対話するには、そのスプレッドシートのIDを知っている必要があります。これは、URLから見つけることができます。

この例では、次の場所にある「費用」という一般向けのスプレッドシートを使用します。

このURLに基​​づいて、このスプレッドシートのIDを「1sILuxZUnyl__7-MlNThjt765oWshN3Xs-PPLfqYe4DhI」として識別できます。

また、** 値を読み書きするには、 spreadsheets.values コレクションを使用します。

値は ValueRange オブジェクトとして表されます。これは、シート内の行または列に対応する、Java __Objectsのリストのリストです。

Sheets サービスオブジェクトとSPREADSHEET__ID定数を初期化するテストクラスを作成しましょう。

public class GoogleSheetsIntegrationTest {
    private static Sheets sheetsService;
    private static String SPREADSHEET__ID =//...

    @BeforeClass
    public static void setup() throws GeneralSecurityException, IOException {
        sheetsService = SheetsServiceUtil.getSheetsService();
    }
}

それから、値を書くことができます:

  • 単一範囲への書き込み

  • 複数範囲への書き込み

  • テーブルの後にデータを追加する

5.1. 単一範囲への書き込み

シート上の単一の範囲に値を書き込むには、 spreadsheets()。values()。update() メソッドを使用します。

@Test
public void whenWriteSheet__thenReadSheetOk() throws IOException {
    ValueRange body = new ValueRange()
      .setValues(Arrays.asList(
        Arrays.asList("Expenses January"),
        Arrays.asList("books", "30"),
        Arrays.asList("pens", "10"),
        Arrays.asList("Expenses February"),
        Arrays.asList("clothes", "20"),
        Arrays.asList("shoes", "5")));
    UpdateValuesResponse result = sheetsService.spreadsheets().values()
      .update(SPREADSHEET__ID, "A1", body)
      .setValueInputOption("RAW")
      .execute();
}

ここでは、最初に2か月間の経費のリストを含む複数の行を持つ ValueRange オブジェクトを作成します。

次に、 update() メソッドを使用して、「A1」セルから始めて、指定されたIDでスプレッドシートに値を書き込むリクエストを作成します。

  • リクエストを送信するには、 execute() メソッドを使用しています。

値セットを行ではなく列と見なす場合は、 setMajorDimension(“ COLUMNS”) メソッドを使用できます。

「RAW」入力オプションは、値が正確にそのまま書き込まれ、計算されないことを意味します。

このJUnitテストを実行すると、アプリケーションはシステムのデフォルトブラウザを使用してブラウザウィンドウを開き、ユーザにログインを要求し、ユーザの代わりにGoogleスプレッドシートと対話する許可をアプリケーションに与えます。

リンク:/uploads/allow-1-300x224.png%20300w[]

OAuth Service Account をお持ちの場合、この手動の手順は省略できます。

  • スプレッドシートを表示または編集できるようにするためのアプリケーションの要件は、サインインしているユーザーにスプレッドシートへの表示または編集アクセス権があることです。この例で使用するスプレッドシートは、パブリック編集アクセスに設定されています。

スプレッドシートを確認すると、範囲「 A1:B6 」が値セットで更新されています。

単一のリクエストで複数の異なる範囲への書き込みに移りましょう。

5.2. 複数の範囲への書き込み

シート上の複数の範囲を更新したい場合は、パフォーマンス向上のために BatchUpdateValuesRequest を使用できます。

List<ValueRange> data = new ArrayList<>();
data.add(new ValueRange()
  .setRange("D1")
  .setValues(Arrays.asList(
    Arrays.asList("January Total", "=B2+B3"))));
data.add(new ValueRange()
  .setRange("D4")
  .setValues(Arrays.asList(
    Arrays.asList("February Total", "=B5+B6"))));

BatchUpdateValuesRequest batchBody = new BatchUpdateValuesRequest()
  .setValueInputOption("USER__ENTERED")
  .setData(data);

BatchUpdateValuesResponse batchResult = sheetsService.spreadsheets().values()
  .batchUpdate(SPREADSHEET__ID, batchBody)
  .execute();

この例では、最初に__ValueRangesのリストを作成しています。各リストは、月の名前と経費の合計を表す2つのセルで構成されています。

次に、 "RAW"とは対照的に** "入力オプション " USER ENTERED "、 を使用して BatchUpdateValuesRequest を作成します。これは、セル値は他の2つのセルを追加する式に基づいて計算されることを意味します。

最後に、 batchUpdate リクエストを作成して送信します。その結果、範囲「 D1:E1 」と「 D4:E4 」が更新されます。

5.3. テーブルの後にデータを追加する

シートに値を書き込むもう1つの方法は、表の最後に値を追加することです。

これには、 append() メソッドを使用できます。

ValueRange appendBody = new ValueRange()
  .setValues(Arrays.asList(
    Arrays.asList("Total", "=E1+E4")));
AppendValuesResponse appendResult = sheetsService.spreadsheets().values()
  .append(SPREADSHEET__ID, "A1", appendBody)
  .setValueInputOption("USER__ENTERED")
  .setInsertDataOption("INSERT__ROWS")
  .setIncludeValuesInResponse(true)
  .execute();

ValueRange total = appendResult.getUpdates().getUpdatedData();
assertThat(total.getValues().get(0).get(1)).isEqualTo("65");

まず、追加したいセル値を含む ValueRange オブジェクトを作成します。

私たちの場合、これには、““ E1” と“““ E2” のセル値を追加することによって見つけた両方の月の総経費を含むセルが含まれています。

次に、「 A1 」セルを含むテーブルの後にデータを追加するリクエストを作成します。

INSERT ROWS オプションは、データを新しい行に追加し、テーブルの後にある既存のデータを置き換えないことを意味します。つまり、この例では最初の実行で範囲「 A7:B7__」が書き込まれます。

その後の実行では、 "A1" セルで始まるテーブルは "A7:B7" 行を含むように拡大されるため、新しい行は "A8:B8" 行に続きます。 。

また、リクエストに対するレスポンスを検証したい場合は、 includeValuesInResponse プロパティをtrueに設定する必要があります。その結果、レスポンスオブジェクトには更新されたデータが含まれます。

6. シートから値を読み取る

シートから値を読み取ることで、値が正しく書き込まれたことを確認しましょう。

  • これは、 spreadsheets()。values()。get() メソッドを使用して単一の範囲を読み取るか、 batchUpdate() メソッドを使用して複数の範囲を読み取ることによって実現できます。

List<String> ranges = Arrays.asList("E1","E4");
BatchGetValuesResponse readResult = sheetsService.spreadsheets().values()
  .batchGet(SPREADSHEET__ID)
  .setRanges(ranges)
  .execute();

ValueRange januaryTotal = readResult.getValueRanges().get(0);
assertThat(januaryTotal.getValues().get(0).get(0))
  .isEqualTo("40");

ValueRange febTotal = readResult.getValueRanges().get(1);
assertThat(febTotal.getValues().get(0).get(0))
  .isEqualTo("25");

ここでは、 “ E1” “ E4” の範囲を読み、それらが以前に書いた各月の合計を含んでいることを確認しています。

7. 新しいスプレッドシートを作成する

値の読み取りと更新の他に、 spreadsheets() spreadsheets()。sheets() コレクションを使用して、シートまたはスプレッドシート全体を操作することもできます。

新しいスプレッドシートを作成する例を見てみましょう。

@Test
public void test() throws IOException {
    Spreadsheet spreadSheet = new Spreadsheet().setProperties(
      new SpreadsheetProperties().setTitle("My Spreadsheet"));
    Spreadsheet result = sheetsService
      .spreadsheets()
      .create(spreadSheet).execute();

    assertThat(result.getSpreadsheetId()).isNotNull();
}

ここでは、最初に " My Spreadsheet"というタイトルの Spreadsheet オブジェクトを作成し、次に create() メソッドと execute()__メソッドを使用してリクエストを作成して送信します。

新しいスプレッドシートは非公開になり、サインインしたユーザーのドライブに配置されます。

** 8その他の更新操作

  • 他のほとんどの操作は Request オブジェクトの形式を取ります。それを次にリストに追加し、__BatchUpdateSpreadsheetRequestを作成するために使用します。

スプレッドシートのタイトルを変更し、セルのセットをあるシートから別のシートにコピーアンドペーストするために2つのリクエストを送信する方法を見てみましょう。

@Test
public void whenUpdateSpreadSheetTitle__thenOk() throws IOException {
    UpdateSpreadsheetPropertiesRequest updateSpreadSheetRequest
      = new UpdateSpreadsheetPropertiesRequest().setFields("** ")
      .setProperties(new SpreadsheetProperties().setTitle("Expenses"));

    CopyPasteRequest copyRequest = new CopyPasteRequest()
      .setSource(new GridRange().setSheetId(0)
        .setStartColumnIndex(0).setEndColumnIndex(2)
        .setStartRowIndex(0).setEndRowIndex(1))
      .setDestination(new GridRange().setSheetId(1)
        .setStartColumnIndex(0).setEndColumnIndex(2)
        .setStartRowIndex(0).setEndRowIndex(1))
      .setPasteType("PASTE__VALUES");

    List<Request> requests = new ArrayList<>();
    requests.add(new Request()
      .setCopyPaste(copyRequest));
    requests.add(new Request()
      .setUpdateSpreadsheetProperties(updateSpreadSheetRequest));

    BatchUpdateSpreadsheetRequest body
      = new BatchUpdateSpreadsheetRequest().setRequests(requests);

    sheetsService.spreadsheets().batchUpdate(SPREADSHEET__ID, body).execute();
}

ここでは、新しいタイトルを指定する UpdateSpreadSheetPropertiesRequest オブジェクト、操作の送信元と送信先を含む CopyPasteRequest オブジェクトを作成し、それらを List of Requests. に追加します

次に、両方のリクエストを一括更新として実行します。

他の多くの種類の要求も同様に使用できます。

たとえば、 AddSheetRequest を使用してスプレッドシートに新しいシートを作成したり、 FindReplaceRequest. を使用して値を変更することができます。

境界線の変更、フィルタの追加、セルの結合など、他の操作を実行できます。 Request タイプの完全なリストはhttps://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#request[ここ]にあります。

9結論

この記事では、JavaアプリケーションからGoogle Sheets APIに接続する方法と、Google Sheetsに保存されているドキュメントを操作する例をいくつか紹介しました。

例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/libraries[over GitHub]にあります。