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 таблиц.
Если я правильно понимаю, как насчет этого ответа? Подумайте об этом как об одном из нескольких возможных ответов.
Пункты модификации:
- Когда я увидел сценарий библиотеки
gopkg.in/Iwark/spreadsheet.v2
, Я заметил, что значения извлекаются методом spreadsheets.get в Sheets API. - Кроме того, было обнаружено, что
spreadsheetId,properties.title,sheets(properties,data.rowData.values(formattedValue,note))
использовался как поля. Кажется, что поля постоянные.
Причина вашей проблемы в том, что значения извлекаются с помощью 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)
}
- Вот,
UNFORMATTED_VALUE
используется для получения значений без формата ячейки. На это уже ответил альберто вьельма
Ссылки:
- Метод: spreadsheets.get
- google-api-go-client
- Перейти к быстрому запуску
- Метод: spreadsheets.values.get
Если я неправильно понял ваш вопрос и это было не то направление, которое вам нужно, я прошу прощения.
Да, выход есть. В конечной точке Method: spreadsheets.values.get есть параметр запроса с именем valueRenderOption, одно из значений которого UNFORMATTED_VALUE, как следует из названия, он вернет вам все данные без формата.
Попробуйте этот запрос с диапазоном значений, которые вы хотите поиграть с API, и посмотрите, таким образом, неформатированные значения, которые он вернет.