如何使用 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 创建动画精灵?

如何在 Pygame 中使用 Sprite Sheets 创建动画精灵?

如何使用 Python 访问(读取、写入)Google Sheets 电子表格?