【问题标题】:Google Sheets Java API v4 BatchUpdateGoogle 表格 Java API v4 批量更新
【发布时间】:2016-07-27 16:48:04
【问题描述】:

以下代码实际上只是 Google Sheets Java API v4 QuickStart 代码示例,但用于 BatchUpdate 的代码,我从另一篇文章中复制了该代码以进行尝试;运行代码会给出一个引用 JSON 对象的异常,包括文本:

"message" : "请求的身份验证范围不足。", “原因”:“禁止”

当代码访问电子表格并毫无问题地获取数据时,我不明白它是如何错过权限的,尽管我从中复制它的代码使用 P12 密钥而不是 client_secrets.json 文件。

任何指针将不胜感激。 谢谢。

代码:

    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.json.JsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.*;
import com.google.api.services.sheets.v4.Sheets;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class SheetsQuickstart {
    /** Application name. */
    private static final String APPLICATION_NAME =
        "Google Sheets API Java Quickstart";

    /** Directory to store user credentials for this application. */
    private static final java.io.File DATA_STORE_DIR = new java.io.File(
        System.getProperty("user.home"), ".credentials/sheets.googleapis.com-java-quickstart.json");

    /** Global instance of the {@link FileDataStoreFactory}. */
    private static FileDataStoreFactory DATA_STORE_FACTORY;

    /** Global instance of the JSON factory. */
    private static final JsonFactory JSON_FACTORY =
        JacksonFactory.getDefaultInstance();

    /** Global instance of the HTTP transport. */
    private static HttpTransport HTTP_TRANSPORT;

    /** Global instance of the scopes required by this quickstart.
     *
     * If modifying these scopes, delete your previously saved credentials
     * at ~/.credentials/sheets.googleapis.com-java-quickstart.json
     */
    private static final List<String> SCOPES =
        Arrays.asList(new String[]{ SheetsScopes.SPREADSHEETS});

    static {
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {
            t.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * Creates an authorized Credential object.
     * @return an authorized Credential object.
     * @throws IOException
     */
    public static Credential authorize() throws IOException {
        // Load client secrets.
        InputStream in =
            SheetsQuickstart.class.getResourceAsStream("/client_secret.json");
        GoogleClientSecrets clientSecrets =
            GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow.Builder authf = new GoogleAuthorizationCodeFlow.Builder(
                    HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES);
        for(String s: authf.getScopes()) System.out.println(s);
        GoogleAuthorizationCodeFlow flow = authf
                .setDataStoreFactory(DATA_STORE_FACTORY)
                .setAccessType("offline")
                .build();
        Credential credential = new AuthorizationCodeInstalledApp(
            flow, new LocalServerReceiver()).authorize("user");
        System.out.println(
                "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
    }

    /**
     * Build and return an authorized Sheets API client service.
     * @return an authorized Sheets API client service
     * @throws IOException
     */
    public static Sheets getSheetsService() throws IOException {
        Credential credential = authorize();
        return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    public static void main(String[] args) throws IOException {
        // Build a new authorized API client service.

        Sheets service = getSheetsService();

        String spsId         = "1bvToosbxMkt40FUyOjNCXdIP8N_LAZrBz_CwkloLx8g";
        Spreadsheet sh = service.spreadsheets().get(spsId).execute();

        ValueRange rsp = service.spreadsheets().values().get(spsId, "A1:B").execute();

        List<List<Object>> vls = rsp.getValues();
        if (vls == null || vls.size() == 0) {
            System.out.println("No data found.");
        } else {
          for (List row : vls) {
            // Print columns A and E, which correspond to indices 0 and 4.
            if(row.size() > 1)  
            System.out.println(row.get(0) + " " + row.get(1));
          }
        }

        List<ValueRange> oList = new ArrayList<>();
        oList.add(vr);

        List<RowData> rowData = new ArrayList<RowData>();

        CellData cell = new CellData();
        cell.setUserEnteredValue(new ExtendedValue().setStringValue("3355"));

        List<CellData> cellData = new ArrayList<CellData>();
        cellData.add(cell);
        rowData.add(new RowData().setValues(cellData));

        BatchUpdateSpreadsheetRequest batchRequests = new BatchUpdateSpreadsheetRequest();
        BatchUpdateSpreadsheetResponse response;

        AppendCellsRequest aCR = new AppendCellsRequest();
        List<Request> requests = new ArrayList<Request>();
        requests.add( new Request().setAppendCells(aCR));
        batchRequests.setRequests( requests );

        response=  service.spreadsheets().batchUpdate(spsId, batchRequests).execute();
    }
}

【问题讨论】:

  • 昨天我忘了检查它是否包含在内。

标签: java oauth-2.0 google-oauth google-sheets-api


【解决方案1】:

请尝试添加您的应用程序需要的范围信息。

Method: spreadsheets.batchUpdate 中所述,需要以下 OAuth 范围之一:

  • https://www.googleapis.com/auth/drive
  • https://www.googleapis.com/auth/spreadsheets

Google Sheets API 的可用 OAuth 2.0 范围信息列在 Authorizing requests with OAuth 2.0 中,除此之外,此 SO 帖子 - Google spreadsheet api Request had insufficient authentication scopes 中给出的解决方案也可能有所帮助。

【讨论】:

  • 我已经阅读了那个答案,一个包含三个部分的解决方案 (stackoverflow.com/questions/37520782/…):问题看起来是我需要处理工作表授权的细节:有两个授权级别,当我更改电子表格的权限时,我错过了那个细节:谢谢你指点给我:现在代码可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多