我只尝试从电子表格的URL上获取内容
这次我将介绍如何仅通过URL获取表格,而不知道表格名称的情况下。
首先,我会介绍一个常见的获取表格的示例代码。
从阅读代码中可以理解,它是通过使用表格的ID和表格名称来获取的。
package main
import (
"context"
"fmt"
"log"
"google.golang.org/api/option"
"google.golang.org/api/sheets/v4"
)
func main() {
spreadsheetID := "1zrqghzR3UJdrS70JLKLgujCnmGFN93vIf1B7XmtblOM"
credential := option.WithCredentialsFile("test.json")
srv, err := sheets.NewService(context.TODO(), credential)
if err != nil {
log.Fatal(err)
}
// シート名と参照範囲をくっつけた文字列を使う(シート名だけでもおk)
readRange := "シート1!A1"
resp, err := srv.Spreadsheets.Values.Get(spreadsheetID, readRange).Do()
if err != nil {
log.Fatalln(err)
}
for _, row := range resp.Values {
fmt.Println(row)
}
}
请问,要只通过类似这样的URL来获取内容,该怎么做呢?
据我所查, 根据现有信息,如果不知道工作表的名称,则无法获取工作表,因此需要找到工作表的名称。
首先解释一下电子表格的URL。结构如下所示。
https://docs.google.com/spreadsheets/d/{スプレッドシートID}/edit#gid={シートID}
本次处理中,需要类似于Gid的编号作为表格ID。
似乎在最初创建的页面中,表格ID总是为0。
下面的代码是用来根据表格ID获取表格名称。
package main
import (
"context"
"fmt"
"log"
"google.golang.org/api/option"
"google.golang.org/api/sheets/v4"
)
var spreadsheetID = "1zrqghzR3UJdrS70JLKLgujCnmGFN93vIf1B7XmtblOM"
func main() {
credential := option.WithCredentialsFile("test.json")
srv, err := sheets.NewService(context.TODO(), credential)
if err != nil {
log.Fatal(err)
}
resp, err := srv.Spreadsheets.Get(spreadsheetID).Do()
if err != nil {
log.Fatalln(err)
}
for _, v := range resp.Sheets {
fmt.Printf("title: %s, sheet_id(gid): %d\n", v.Properties.Title, v.Properties.SheetId)
}
}
会以如下方式输出。
title: シート1, sheet_id(gid): 0
title: シート2, sheet_id(gid): 680451458
title: シート3, sheet_id(gid): 1891750325
title: シート4, sheet_id(gid): 317507870
通过完全搜索,可以从匹配的表格ID获取表格名称。
使用此逻辑,将编写一段从URL获取表格内容的处理代码。
与以往不同,这次将使用函数将所需步骤分开处理。
package main
import (
"context"
"fmt"
"log"
"net/url"
"regexp"
"strconv"
"google.golang.org/api/option"
"google.golang.org/api/sheets/v4"
)
func createService(ctx context.Context) (srv *sheets.Service, err error) {
credential := option.WithCredentialsFile("test.json")
srv, err = sheets.NewService(ctx, credential)
if err != nil {
return
}
return
}
//regex使ってみた
func getID(spreadSheetURL string) (spreadsheetID string, sheetID int64, err error) {
u, err := url.Parse(spreadSheetURL)
if err != nil {
return
}
repPath := regexp.MustCompile(`/`)
spreadsheetID = repPath.Split(u.Path, -1)[3]
repFragment := regexp.MustCompile(`gid=`)
tmp := repFragment.Split(u.Fragment, -1)[1]
sheetID, err = strconv.ParseInt(tmp, 10, 64)
if err != nil {
return "", 0, err
}
return
}
// ここ重要
func getSheetName(srv *sheets.Service, spreadsheetID string, sheetID int64) (sheetName string, err error) {
resp, err := srv.Spreadsheets.Get(spreadsheetID).Do()
if err != nil {
return
}
for _, v := range resp.Sheets {
fmt.Printf("title: %s, sheet_id: (gid)%d\n", v.Properties.Title, v.Properties.SheetId)
if sheetID == v.Properties.SheetId {
sheetName = v.Properties.Title
break
}
}
return
}
func getSheetContent(srv *sheets.Service, sheetName string, spreadsheetID string) (content *sheets.ValueRange, err error) {
readRange := fmt.Sprintf("%s%s", sheetName, "!A1")
content, err = srv.Spreadsheets.Values.Get(spreadsheetID, readRange).Do()
if err != nil {
return
}
return
}
func main() {
spreadSheetURL := "https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxx/edit#gid=1891750325"
ctx := context.Background()
srv, err := createService(ctx)
if err != nil {
log.Fatalln(err)
}
spreadsheetID, sheetID, err := getID(spreadSheetURL)
if err != nil {
log.Fatalln(err)
}
sheetName, err := getSheetName(srv, spreadsheetID, sheetID)
if err != nil {
log.Fatalln(err)
}
content, err := getSheetContent(srv, sheetName, spreadsheetID)
if err != nil {s
log.Fatalln(err)
}
fmt.Println(content.Values)
}
在样本代码和博客中,没有提到从表格ID中获取的方法,所以我阅读了参考资料并找到了一些提示。也许这不是一个需要的功能吧…
从Sheets中可以获取各种信息,所以当遇到困难时,看一看可能会很有帮助。
如果可以的话请给个赞。