Google 张 API - 下载没有格式的数据

Google sheets API - download data with no formatting

使用 Go,在获取 sheet 数据时,数据以其应用的单元格格式到达 即 "3,456" 而我需要原始的 123456.

api 中是否有可以删除格式的内容?喜欢 formatting: false

代码:

package main

import (
    "log"

    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
    "gopkg.in/Iwark/spreadsheet.v2"
)

func main() {
    service := authenticate()
    spreadsheet, err := service.FetchSpreadsheet(spreadsheetID)
    checkError(err)
    sheet, err := spreadsheet.SheetByIndex(1)
    checkError(err)

    for _, row := range sheet.Rows {
        var csvRow []string
        for _, cell := range row {
            csvRow = append(csvRow, cell.Value)
        }
        log.Println(csvRow)
    }
}

// function to authenticate on Google
func authenticate() *spreadsheet.Service {
    data, err := ioutil.ReadFile("secret.json")
    checkError(err)
    conf, err := google.JWTConfigFromJSON(data, spreadsheet.Scope)
    checkError(err)
    client := conf.Client(context.TODO())
    service := spreadsheet.NewServiceWithClient(client)
    return service
}

func checkError(err error) {
    if err != nil {
        panic(err.Error())
    }
}

是的,有办法。在Method: spreadsheets.values.get endpoint, there is a request parameter called valueRenderOption中,它的其中一个值是UNFORMATTED_VALUE,顾名思义,它会返回所有没有格式的数据。

Try this Request 与您想要使用 API 的值范围,并以这种方式查看它将 return 的未格式化值。

  • 您想从 Google 电子表格中将 3,456 检索为 123456
  • 3,456 由单元格格式显示。其实就是这个数字。
  • 您想使用 gopkg.in/Iwark/spreadsheet.v2 和 golang 来实现此目的。
  • 您已经能够使用带有表格 API 的服务帐户为 Google 电子表格获取和放置值。

如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。

修改点:

您遇到问题的原因是这些值是使用 formattedValue 检索的。在您的情况下,需要使用 userEnteredValue.

检索值

当你想使用gopkg.in/Iwark/spreadsheet.v2的库来实现你的目的时,为了将以上反映到库中,需要修改库的脚本。

修改后的脚本:

请修改gopkg.in/Iwark/spreadsheet.v2的文件如下。当然,请备份原文件,以便回到原库。

1。 service.go

修改the line 116如下。

从:
fields := "spreadsheetId,properties.title,sheets(properties,data.rowData.values(formattedValue,note))"
到:
fields := "spreadsheetId,properties.title,sheets(properties,data.rowData.values(formattedValue,note,userEnteredValue))"

2。 sheet.go

修改the line 52如下。

从:
Value:  cellData.FormattedValue,
到:
Value:  strconv.FormatFloat(cellData.UserEnteredValue.NumberValue, 'f', 4, 64),

并将 "strconv" 添加到 import 部分,如下所示。

import (
    "encoding/json"
    "strings"
    "strconv"
)

3。 cell_data.go

修改the line 8如下。

从:
// UserEnteredFormat *CellFormat `json:"userEnteredFormat"`
到:
UserEnteredFormat struct {
    NumberValue float64 `json:"numberValue"`
} `json:"userEnteredFormat"`

结果:

在这种情况下,您的脚本不需要修改。经过以上修改,当你运行你的脚本时,你可以在控制台看到[123456.0000]。作为重要的一点,这个库似乎使用值作为字符串类型。在这次修改中,我使用了这个。但是如果你想把它作为其他类型使用,请修改库。

其他图案:

作为实现目标的另一种模式,使用google-api-go-client怎么样?关于这个,大家可以在Go Quickstart看到。使用google-api-go-client时,示例脚本如下。本例作为测试用例,使用了spreadsheets.get的方法

示例脚本 1:

在此示例脚本中,您脚本中的 authenticate()checkError() 是通过修改使用的。

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"

    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/sheets/v4"
)

func main() {
    c := authenticate()
    sheetsService, err := sheets.New(c)
    checkError(err)
    spreadsheetId := "###"  // Please set the Spreadsheet ID.
    ranges := []string{"Sheet1"}  // Please set the sheet name.
    resp, err := sheetsService.Spreadsheets.Get(spreadsheetId).Ranges(ranges...).Fields("sheets.data.rowData.values.userEnteredValue").Do()
    checkError(err)
    for _, row := range resp.Sheets[0].Data[0].RowData {
        for _, col := range row.Values {
            fmt.Println(col.UserEnteredValue)
        }
    }
}

func authenticate() *http.Client {
    data, err := ioutil.ReadFile("serviceAccount_20190511.json")
    checkError(err)
    conf, err := google.JWTConfigFromJSON(data, sheets.SpreadsheetsScope)
    checkError(err)
    client := conf.Client(context.TODO())
    return client
}

func checkError(err error) {
    if err != nil {
        panic(err.Error())
    }
}

示例脚本 2:

使用spreadsheets.values.get时,main()的脚本如下

func main() {
    c := authenticate()
    sheetsService, err := sheets.New(c)
    checkError(err)
    spreadsheetId := "###"  // Please set the Spreadsheet ID.
    sheetName := "Sheet1"  // Please set the sheet name.
    resp, err := sheetsService.Spreadsheets.Values.Get(spreadsheetId, sheetName).ValueRenderOption("UNFORMATTED_VALUE").Do()
    checkError(err)
    fmt.Println(resp.Values)
}
  • 这里,UNFORMATTED_VALUE is used for retrieving the values without the cell format. This has already been answered by

参考文献:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。