API таблиц Google - загрузка данных без форматирования

Используя Go, при выборке данных листа данные прибывают с примененным форматированием ячеек, т.е. "$123,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())
    }
}

2 ответа

Решение
  • Вы хотите получить $123,456 как 123456 из Google Spreadsheet.
  • $123,456отображается форматом ячейки. На самом деле это номер.
  • Вы хотите добиться этого, используя gopkg.in/Iwark/spreadsheet.v2 с голангом.
  • Вы уже могли получать и вводить значения для электронной таблицы Google с помощью учетной записи службы с API таблиц.

Если я правильно понимаю, как насчет этого ответа? Подумайте об этом как об одном из нескольких возможных ответов.

Пункты модификации:

Причина вашей проблемы в том, что значения извлекаются с помощью formattedValue. В вашем случае значения необходимо получить с помощьюuserEnteredValue.

Если вы хотите достичь своей цели, используя библиотеку gopkg.in/Iwark/spreadsheet.v2, чтобы отразить вышесказанное в библиотеке, необходимо изменить скрипт библиотеки.

Измененный скрипт:

Пожалуйста, измените файлы gopkg.in/Iwark/spreadsheet.v2следующее. Конечно, сделайте резервную копию исходных файлов, чтобы вернуться к исходной библиотеке.

1. service.go

Измените строку 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

Измените строку 52 следующим образом.

От:
Value:  cellData.FormattedValue,
Кому:
Value:  strconv.FormatFloat(cellData.UserEnteredValue.NumberValue, 'f', 4, 64),

И добавить "strconv" к import раздел, как показано ниже.

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

3. cell_data.go

Измените строку 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)
}

Ссылки:

Если я неправильно понял ваш вопрос и это было не то направление, которое вам нужно, я прошу прощения.

Да, выход есть. В конечной точке Method: spreadsheets.values.get есть параметр запроса с именем valueRenderOption, одно из значений которого UNFORMATTED_VALUE, как следует из названия, он вернет вам все данные без формата.

Попробуйте этот запрос с диапазоном значений, которые вы хотите поиграть с API, и посмотрите, таким образом, неформатированные значения, которые он вернет.

Другие вопросы по тегам