web-dev-qa-db-ja.com

/ Java)を使用してGoogleスプレッドシートにデータを書き込みます

私はこれに迷っています。 JavaをGoogleスプレッドシートに接続しようとしています。データの取得に関するAPIのドキュメントは完全です(そして正常に動作しています)が、スプレッドシートに書き込む方法を理解できません。 。

誰でも、Googleスプレッドシートに非常に単純なデータ入力を行う方法について(必要なインポートとすべてを含む)fullの例を提供してください(たとえば、「asdf」をSheet1のA1セルに入力します) ?

このようなチュートリアルがどこかに存在する場合、私はそれを見つけることができませんでした-どんなポインタでも大歓迎です。

どうもありがとう、Zsolt

7
Zsolt Balla

これは、書き込みを実行するためのクイックスタートチュートリアルコードの修正バージョンです。

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.Java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.ValueRange;
import Java.io.*;
import Java.util.*;

public class SheetsIntegration {

    private static HttpTransport transport;
    private static JacksonFactory jsonFactory;
    private static FileDataStoreFactory dataStoreFactory;

この行で権限の警告が表示されますが、致命的ではありません

    private static final Java.io.File DATA_STORE_DIR = new Java.io.File(System.getProperty("user.home"), ".credentials/sheets.googleapis.com.json");

クイックスタートチュートリアルでは、代わりに読み取り専用スコープを使用しています

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

    public SheetsIntegration() {
        try {
            transport = GoogleNetHttpTransport.newTrustedTransport();
            dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);
            jsonFactory = JacksonFactory.getDefaultInstance();

            service = getSheetsService();
        } catch (Exception e) {
            // handle exception
        }
    }

クイックスタートチュートリアルに従って、Googleから認定ファイルをダウンロードする必要があります。

public static Credential authorize() throws IOException {
    // Load client secrets.
    File cfile = new File("certs/cert.json");
    cfile.createNewFile();
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, new InputStreamReader(new FileInputStream(cfile)));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow.Builder(
                    transport, jsonFactory, clientSecrets, scopes)
                    .setDataStoreFactory(dataStoreFactory)
                    .setAccessType("offline")
                    .build();
    Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    return credential;
}

public static Sheets getSheetsService() throws IOException {
    Credential credential = authorize();
    return new Sheets.Builder(transport, jsonFactory, credential)
            .setApplicationName("INSERT_YOUR_APPLICATION_NAME")
            .build();
}

public void writeSomething(List<Data> myData) {

    try {
        String id = "INSERT_SHEET_ID";
        String writeRange = "INSERT_SHEET_NAME!A3:E";

        List<List<Object>> writeData = new ArrayList<>();
        for (Data someData: myData) {
            List<Object> dataRow = new ArrayList<>();
            dataRow.add(someData.data1);
            dataRow.add(someData.data2);
            dataRow.add(someData.data3);
            dataRow.add(someData.data4);
            dataRow.add(someData.data5);
            writeData.add(dataRow);
        }

        ValueRange vr = new ValueRange().setValues(writeData).setMajorDimension("ROWS");
        service.spreadsheets().values()
                .update(id, writeRange, vr)
                .setValueInputOption("RAW")
                .execute();
    } catch (Exception e) {
        // handle exception
    }
}

もう1つの注意事項-servlet-api.jarをプロジェクトに追加する必要がありました。

12
stuart_gunn

OK、最終的にそれを理解するのに数時間かかりました。答えは、Ajaxリクエストを最初から作成するよりも簡単であることがわかりました。他の人のために何時間も節約することを期待して、これが私のために働いた解決策です。

前提条件: Google Sheets APIのクイックスタートチュートリアル を使用してテーブルから読み取りました。これはかなり複雑ですが、問題なく機能しました。

チュートリアルの後、私はいくつかのことを修正する必要がありましたが

1、行を変更します

private static final List<String> SCOPES =
        Arrays.asList(SheetsScopes.SPREADSHEETS_READONLY);

private static final List<String> SCOPES =
        Arrays.asList(SheetsScopes.SPREADSHEETS);

明らかな理由で(テーブルを読み取るだけでなく、テーブルを記述したいため)。

2、/。credentials /というフォルダーのユーザーディレクトリに保存されている保存された資格情報を削除します

もう1つの注意:と呼ばれるメソッドがあるようです

spreadsheets.values.update()

しかし、valueInputOptionパラメータを設定する必要があり、何時間もの検索でどこに設定できるかを見つけるのに十分ではなかったため、私はそれを機能させることができませんでした。

それで、最終的に、私はというメソッドに行き着きました

spreadsheets.values.batchUpdate()

"Hello World!"をテーブルセルに書き込むトリックを実行したコードフルメソッドは次のとおりです(インポートに関しては、上記のクイックスタートチュートリアルと同じものを使用しました)。

void WriteExample() throws IOException {
    Sheets service = getSheetsService();
    List<Request> requests = new ArrayList<>();

      List<CellData> values = new ArrayList<>();


      values.add(new CellData()
                .setUserEnteredValue(new ExtendedValue()
                        .setStringValue("Hello World!")));
        requests.add(new Request()
                .setUpdateCells(new UpdateCellsRequest()
                        .setStart(new GridCoordinate()
                                .setSheetId(0)
                                .setRowIndex(0)
                                .setColumnIndex(0))
                        .setRows(Arrays.asList(
                                new RowData().setValues(values)))
                        .setFields("userEnteredValue,userEnteredFormat.backgroundColor")));

        BatchUpdateSpreadsheetRequest batchUpdateRequest = new BatchUpdateSpreadsheetRequest()
                .setRequests(requests);
        service.spreadsheets().batchUpdate(spreadsheetId, batchUpdateRequest)
                .execute();
    }

SheetIdは、作成しているワークシートのIDです(特定のスプレッドシートの最初のワークシートの場合は常に0であり、他のスプレッドシートのURLから取得できます。これは#gid=の後の部分です

フォーマットや数式の使用など、さらに複雑な場合は、-この場合は ここで提供されているJavaの例 を使用できます。

お役に立てば幸いです、Zsolt

11
Zsolt Balla

XmlHttpRequestリクエストを利用します。

実際にグーグルスプレッドシートに書き込む簡単なデモを紹介します。次に、好みの言語であるJavaを使用して、ここで概念を適用します。

  1. グーグルスプレッドシートを開いて書き込みます。 スプレッドシートIDを取得します
  2. oauth playground に移動し、Google Sheets API v4に移動します
  3. https://www.googleapis.com/auth/drive権限を選択します。 [APIの承認]をクリックします。許可を許可します。
  4. ステップ2で、[トークンのExchange認証コード]ボタンを押します。
  5. 手順3で、これをリクエストURIに貼り付けます。

    https://sheets.googleapis.com/v4/spreadsheets/ {SpreadsheetID}/values/Sheet1!A1?valueInputOption = USER_ENTERED

HTTPメソッドは[〜#〜] put [〜#〜]です。

これをEnterRequestBody内に配置します

{
  "range":"Sheet1!A1",
  "majorDimension": "ROWS",
  "values": [
    ["Hello World"]
  ],
}

Send the Requestをクリックします。 200 OK応答を受け取った場合は、スプレッドシートのA1セルに「HelloWorld」と書かれていることを期待してください。 ここでSheets v4にデータを書き込む について詳しく読むことができます。

これをJavaで行う方法は? AJAXまたはJavaでのXHR実装について学習します。開始するには このチュートリアル を確認してください。

2
noogui