如何使用 Sheets APIv4 Java 在 Google 表格中插入一行
Posted
技术标签:
【中文标题】如何使用 Sheets APIv4 Java 在 Google 表格中插入一行【英文标题】:How do you insert a single row into Google sheets using Sheets APIv4 Java 【发布时间】:2019-07-06 11:04:49 【问题描述】:如果我想在指定索引处使用 Java 将一行插入到 Google 工作表中,然后写入该行,我该怎么做?
【问题讨论】:
【参考方案1】:经过大量的谷歌搜索、一些挣扎和adapting another answer,我能够弄清楚这一点。
注意:您可以生成your own credentials.json
。这位于大多数 IDE 中的“资源”文件夹中。
这是我使用的完整代码——您需要的相关方法是下面的insertRow
方法,它是从writeTest
调用的。在正常情况下,我只会发布有问题的方法,但是“表格 API 中的 quickstart" 肯定是缺少的,所以这里是完整的源代码:
类和导入
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.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
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.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SheetsTest
private static final String APPLICATION_NAME = "Metrics project";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";
private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);
private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
getCredentials:
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException
InputStream in = SheetsTest.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline")
.build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
writeTest
//Creates a new row at row 2 then writes data to it...
static void writeTest(Report r, String sheetID, String range)throws GeneralSecurityException, IOException
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
ValueRange requestBody = requestBuilder(r, range);
Sheets sheetsService = new Sheets.Builder(HTTP_TRANSPORT,JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
insertRow(sheetsService, sheetID);
Sheets.Spreadsheets.Values.Append request =
sheetsService.spreadsheets().values().append(sheetID, range, requestBody);
request.setValueInputOption("RAW");
//request.setInsertDataOption("INSERT_ROWS");
AppendValuesResponse resp = request.execute();
System.out.println(resp);
插入行
//Inserts row at index, this is hardcoded to row 2 (0-indexed)
private static void insertRow(Sheets ss, String sheetID)throws IOException
InsertDimensionRequest insertRow = new InsertDimensionRequest();
insertRow.setRange(new DimensionRange().setDimension("ROWS").setStartIndex(1).setEndIndex(2).setSheetId(0));
BatchUpdateSpreadsheetRequest r = new BatchUpdateSpreadsheetRequest().setRequests(Arrays.asList(
new Request().setInsertDimension(insertRow)
));
ss.spreadsheets().batchUpdate(sheetID, r).execute();
requestBuilder
//Populate ValueRange
static ValueRange requestBuilder( Report r, String range)
ValueRange v = new ValueRange()
.setValues(Arrays.asList(
Arrays.asList(r.value1),
Arrays.asList(r.value2),
Arrays.asList(r.value3),
Arrays.asList(r.value4),
Arrays.asList(r.value5)
))
.setMajorDimension("ROWS")
.setRange(range)
;
return v;
【讨论】:
【参考方案2】:我不能对 Elric 的回答发表评论,但我只想更正一下。
要使用您的值添加一行,在方法中:
requestBuilder \
应该是.setMajorDimension("COLUMNS")
而不是"ROWS
。
我希望这会有所帮助。
【讨论】:
它按原样对我有用,但我很乐意对此表示支持,以防它对任何人有所帮助。 我在生产中运行了一段时间,我记得当我有列而不是行时有一些奇怪的东西,并且它以某种方式被颠倒了,但我离开了我的工作我在哪里做这个。幸运的是,我将不得不在不久的将来再次这样做......以上是关于如何使用 Sheets APIv4 Java 在 Google 表格中插入一行的主要内容,如果未能解决你的问题,请参考以下文章
使用Sheets API v4获取与Google帐户关联的所有电子表格列表
使用 Sheets API v4 Java 阅读整个 Google 电子表格
使用 Sheets API v4 (Java) 获取 Google 表格上次编辑日期
如何在 Pygame 中使用 Sprite Sheets 创建动画精灵?