当前位置: 首页 > 知识库问答 >
问题:

Google Sheet API V4(Java)在单元格中追加日期

田博易
2023-03-14

我试图在单元格中添加日期,但工作表自动将值存储在带有单引号的字符串中()。对于在日期中存储值,我们还尝试添加userEnteredFormat,但它不适合我们。

下面是追加请求。

{
requests = [{
    appendCells = {
        fields = userEnteredValue,
        userEnteredFormat.numberFormat,
        rows = [{
            values = [{
                userEnteredValue = {
                    numberValue = 10.0
                }
            }, {
                userEnteredValue = {
                    stringValue = Sample String
                }
            }, {
                userEnteredFormat = {
                    numberFormat = {
                        type = DATE
                    }
                },
                userEnteredValue = {
                    stringValue = 2015 - 07 - 13
                }
            }, {
                userEnteredValue = {
                    boolValue = true
                }
            }, {
                userEnteredFormat = {
                    numberFormat = {
                        type = DATE
                    }
                },
                userEnteredValue = {
                    stringValue = 2015 - 07 - 13
                }
            }]
        }],
        sheetId = abc
    }
}]}

在工作表上附加单个日期单元格的示例代码

package org.pentaho.googlesheets.api;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.pdi.steps.googlesheets.GoogleSheetsOutputStepMeta;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.AppendCellsRequest;
import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest;
import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetResponse;
import com.google.api.services.sheets.v4.model.CellData;
import com.google.api.services.sheets.v4.model.CellFormat;
import com.google.api.services.sheets.v4.model.ExtendedValue;
import com.google.api.services.sheets.v4.model.NumberFormat;
import com.google.api.services.sheets.v4.model.Request;
import com.google.api.services.sheets.v4.model.RowData;

public class DateIssueSample {

    static String APPLICATION_NAME ;
    static JsonFactory JSON_FACTORY;
    static HttpTransport HTTP_TRANSPORT;
    static List<String> SPREADSHEET_SCOPES ;
    static List<String> DRIVE_SCOPES ;
    static Sheets service;

    static String email = "demo-983@praxis-practice-133423.iam.gserviceaccount.com";
    static String pkey ="E:\\P12Key\\My Project-834a8d37d247.p12";

    public static Credential authorize(List<String> SCOPES ) throws Exception {
        GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(HTTP_TRANSPORT)
        .setJsonFactory(JSON_FACTORY)
        .setServiceAccountId(email)
        .setServiceAccountScopes(SCOPES)
        .setServiceAccountPrivateKeyFromP12File(new java.io.File(pkey))
        .build();
        credential.refreshToken();

        return credential;

    }
    public static  Sheets getSheetsService() throws Exception {
        Credential credential = authorize(SPREADSHEET_SCOPES);
        return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }
    public static void main(String[] args) throws Exception {
        APPLICATION_NAME = "PDI";
        JSON_FACTORY =new GsonFactory();
        SPREADSHEET_SCOPES =Arrays.asList(SheetsScopes.SPREADSHEETS);
        DRIVE_SCOPES=Arrays.asList(DriveScopes.DRIVE_METADATA_READONLY);
        HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

        service = getSheetsService();

        String spreadSheetID= "abc";
        Integer sheetID = 123;
        String DateValue = "2015-07-13";

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

        CellData cell = new CellData();
        cell.setUserEnteredValue(new ExtendedValue().setStringValue(DateValue));
        cell.setUserEnteredFormat(new CellFormat().setNumberFormat(new NumberFormat().setType("DATE")));

        cellData.add(cell);
        rowData.add(new RowData().setValues(cellData));

        BatchUpdateSpreadsheetRequest batchRequests = new BatchUpdateSpreadsheetRequest();
        BatchUpdateSpreadsheetResponse response;
        List<Request> requests = new ArrayList<Request>();      

        AppendCellsRequest appendCellReq = new AppendCellsRequest();
        appendCellReq.setSheetId( sheetID);
        appendCellReq.setRows( rowData );           
        appendCellReq.setFields("userEnteredValue,userEnteredFormat.numberFormat");


        requests = new ArrayList<Request>();
        requests.add( new Request().setAppendCells(appendCellReq));
        batchRequests = new BatchUpdateSpreadsheetRequest();
        batchRequests.setRequests( requests );      


        response=  service.spreadsheets().batchUpdate(spreadSheetID, batchRequests).execute();
        System.out.println("Request \n\n");
        System.out.println(batchRequests.toPrettyString());
        System.out.println("\n\nResponse \n\n");
        System.out.println(response.toPrettyString());
    }

}

电子表格,单个日期值附加的示例代码

共有2个答案

笪烨
2023-03-14

请参阅《简介指南》中有关API如何处理日期时间的说明。

工作表中的日期是数字,而不是字符串。(例如,这允许您对它们进行算术运算。)

如果使用“values”集合,则会有用于从字符串转换为日期的钩子,反之亦然(使用不同的ValueInputOptions或ValueRenderOptions)。

不幸的是,值集合中还没有Append方法。因此,要轻松地在存量数据后追加单元格,您需要使用spreadsheets.batch更新,这只是原始电子表格DOM。所以现在,您需要输入日期作为序列号(带有日期格式),如第一个链接所述。

使用单引号添加字符串的原因是,您告诉API要添加字符串,因此在前缀中添加引号,以防止工作表意外地将值解析为日期。

端木骞尧
2023-03-14

为了举例说明Sam的答案是什么意思,如果您只想使用AppendCellsRequest创建日期值,您可以这样创建单元格:

CellData cell = new CellData();
cell.setUserEnteredValue(new ExtendedValue().setNumberValue(42198.0));
cell.setUserEnteredFormat(
    new CellFormat().setNumberFormat(new NumberFormat().setType("DATE")));    

此处42198是1899年12月30日至2015年7月13日之间的天数。

 类似资料:
  • 问题内容: 我试图在单元格中添加日期,但工作表会自动在单引号()的字符串中存储值。对于date中的Store value,我们也尝试添加,但对我们而言无效。 以下是追加请求。 示例代码以在工作表上附加单个日期单元格 SpreadSheet, 单日期值附加的示例代码 问题答案: 为了提供Sam答案的含义的示例,如果您只想使用来创建日期值,则可以这样创建单元格: 这里的42198是1899年12月30

  • 我试图在工作表中附加一个单元格,例如单元格1A有一个边框并填充了灰色,我想插入一个字符串“你好”,但使用 销毁单元格格式,或者更确切地说,使单元格格式处于默认模式。我知道如何使用 方法,但在我的项目中,我用不同的单元格格式插入了许多不同的数据。我在谷歌上搜索了一下,没找到答案。还有别的办法解决我的问题吗? 来阐述我的问题。在1A中的工作表中,我有一个单元格格式单元格格式(用灰色填充,并有细边框)

  • 编辑:使用工作,不知道它是如何工作的

  • 我想知道,我如何追加一个元素到一个ArrayList的结尾在Java?这是我到目前为止的代码: “randomStringGenerator”是一种生成随机字符串的方法。 我基本上想总是在ArrayList的末尾追加随机字符串,就像一个堆栈(因此命名为“推送”)。 非常感谢您抽出时间!

  • 无法找到通过v4 API在google sheets中的特定列末尾追加数据的方法。 我知道我们可以使用append API追加一个全新的行:https://developers.google.com/sheets/api/samples/writing#append_values 但这会从第一列开始添加一个全新的行。我只需要从特定列开始推送/追加数据。 下面是我正在处理的工作表: 现在我需要添加多

  • 问题内容: 我想在包含引号前缀的xlsx工作簿工作表中添加一个单元格,而我正在尝试使用POI库创建该工作表。如何添加这种类型的单元格 我在Maven Central上使用CTXf.setQuotePrefix(boolean quotePrefix)找到了对此的引用,但不知道如何将其添加到XSSFCell 我尝试使用下面的代码 得到例外 谁能帮我这个 问题答案: 的,也是财产的一部分,而不是。 因