我有些迷茫。我试图将Java与Google电子表格连接起来,虽然API文档在检索数据方面非常完整(并且它也正常工作),但我无法弄清楚如何写入电子表格。
请问是否能提供一个完整的示例(包括必要的导入等全部内容),以便进行非常简单的数据输入到Google电子表格(比如,在Sheet1的A1单元格中输入" asdf ")?
如果这样的教程存在于某个地方,我找不到它 - 非常感谢任何指点。
非常感谢, Zsolt
我有些迷茫。我试图将Java与Google电子表格连接起来,虽然API文档在检索数据方面非常完整(并且它也正常工作),但我无法弄清楚如何写入电子表格。
请问是否能提供一个完整的示例(包括必要的导入等全部内容),以便进行非常简单的数据输入到Google电子表格(比如,在Sheet1的A1单元格中输入" asdf ")?
如果这样的教程存在于某个地方,我找不到它 - 非常感谢任何指点。
非常感谢, Zsolt
好的,我花了几个小时才最终搞清楚,答案竟然比从头构建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/ 的文件夹中的存储凭据。
还有一点需要注意:似乎有一个名为
的方法。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
这里是快速入门教程代码的修改版,用于执行写入操作。
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
}
}
根据快速入门教程,您需要从谷歌下载证书文件。
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
}
}
还有一点需要注意 - 我不得不将servlet-api.jar添加到我的项目中。
https://www.googleapis.com/auth/drive
权限。单击授权 API。允许权限。在第三步中,在请求 URI 中粘贴以下内容:
https://sheets.googleapis.com/v4/spreadsheets/{SpreadsheetID}/values/Sheet1!A1?valueInputOption=USER_ENTERED
{
"range":"Sheet1!A1",
"majorDimension": "ROWS",
"values": [
["Hello World"]
],
}
200 OK
响应,则预计 "Hello World" 将被写入您电子表格的 A1 单元格中。
您可以在这里阅读更多关于 在 Sheets v4 中写入数据 的信息。