gpt4 book ai didi

java - Google Sheets Java API v4 批量更新

转载 作者:行者123 更新时间:2023-12-01 16:43:42 25 4
gpt4 key购买 nike

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

"message" : "Request had insufficient authentication scopes.", "reason" : "forbidden"

当代码访问电子表格并毫无问题地获取数据时,我不明白它如何错过权限,尽管我从中复制的代码使用了 P12 key 而不是 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();
}
}

最佳答案

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

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

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

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

关于java - Google Sheets Java API v4 批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38618902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com