我只尝试从电子表格的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中可以获取各种信息,所以当遇到困难时,看一看可能会很有帮助。

如果可以的话请给个赞。

广告
将在 10 秒后关闭
bannerAds