
随着时间的推移,go语言与google sheets的交互方式得到了显著优化。目前,google apps script execution api被认为是实现go语言与google sheets数据读写最灵活和功能最全面的方法。它允许go应用程序远程执行google apps script项目中的函数,从而间接且强大地控制google workspace服务,包括google sheets。这种方法不仅能够实现基本的读写操作,还能利用apps script的强大功能进行更复杂的业务逻辑处理,例如格式化、触发器管理或与其他google服务的集成。
您可以通过官方快速入门指南了解更多详细信息和最新进展:https://www.php.cn/link/8194758636bb0e5bab1a445835138b98
要开始使用Go语言通过Apps Script Execution API操作Google Sheets,需要完成以下准备工作:
在您的Go项目中,需要安装Google API Go客户端库,特别是用于Apps Script的包:
go get google.golang.org/api/script/v1 go get google.golang.org/api/option
认证是访问Google API的关键步骤。以下是基于OAuth 2.0的认证流程概述(服务账号认证类似,但更直接):
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"google.golang.org/api/option"
"google.golang.org/api/script/v1"
)
// 获取OAuth2配置
func getConfig() (*oauth2.Config, error) {
b, err := ioutil.ReadFile("credentials.json") // 您的credentials.json文件
if err != nil {
return nil, fmt.Errorf("无法读取credentials.json文件: %v", err)
}
// 如果是Web应用,这里需要设置RedirectURL
// config, err := google.ConfigFromJSON(b, script.ScriptExternalExecuteScope)
// config.RedirectURL = "http://localhost:8080/callback"
// 桌面应用或CLI应用
config, err := google.ConfigFromJSON(b, script.ScriptExternalExecuteScope)
if err != nil {
return nil, fmt.Errorf("无法解析客户端凭据文件: %v", err)
}
return config, nil
}
// 获取或刷新令牌
func getClient(config *oauth2.Config) *http.Client {
tokFile := "token.json" // 存储用户令牌的文件
tok, err := tokenFromFile(tokFile)
if err != nil {
tok = getTokenFromWeb(config)
saveToken(tokFile, tok)
}
return config.Client(context.Background(), tok)
}
// 从Web获取令牌(首次授权)
func getTokenFromWeb(config *oauth2.Config) *oauth2.Token {
authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
fmt.Printf("请在浏览器中访问此URL进行授权: \n%v\n", authURL)
var authCode string
fmt.Print("输入授权码: ")
if _, err := fmt.Scan(&authCode); err != nil {
log.Fatalf("无法读取授权码: %v", err)
}
tok, err := config.Exchange(context.TODO(), authCode)
if err != nil {
log.Fatalf("无法通过授权码获取令牌: %v", err)
}
return tok
}
// 从文件加载令牌
func tokenFromFile(file string) (*oauth2.Token, error) {
f, err := os.Open(file)
if err != nil {
return nil, err
}
defer f.Close()
tok := &oauth2.Token{}
err = json.NewDecoder(f).Decode(tok)
return tok, err
}
// 将令牌保存到文件
func saveToken(path string, token *oauth2.Token) {
fmt.Printf("将授权令牌保存到文件: %s\n", path)
f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
log.Fatalf("无法保存授权令牌到文件: %v", err)
}
defer f.Close()
json.NewEncoder(f).Encode(token)
}由于Apps Script Execution API是用于执行Apps Script脚本的,因此实际的Sheets读写逻辑将编写在Google Apps Script中,Go程序负责调用这些脚本。
在Google Apps Script(通常通过访问script.google.com或从Google Sheets中“扩展”->“Apps Script”)中创建一个新项目,并编写用于读写Sheets的函数。
示例:读取数据函数 (readSheetData.gs)
function readSheetData(spreadsheetId, sheetName, range) {
try {
var ss = SpreadsheetApp.openById(spreadsheetId);
var sheet = ss.getSheetByName(sheetName);
if (!sheet) {
return { error: "Sheet not found: " + sheetName };
}
var values = sheet.getRange(range).getValues();
return { success: true, data: values };
} catch (e) {
return { error: e.message };
}
}示例:写入数据函数 (writeSheetData.gs)
function writeSheetData(spreadsheetId, sheetName, range, values) {
try {
var ss = SpreadsheetApp.openById(spreadsheetId);
var sheet = ss.getSheetByName(sheetName);
if (!sheet) {
return { error: "Sheet not found: " + sheetName };
}
// 确保values是二维数组
var dataToWrite = Array.isArray(values[0]) ? values : [values];
var targetRange = sheet.getRange(range);
if (targetRange.getNumRows() !== dataToWrite.length || targetRange.getNumColumns() !== dataToWrite[0].length) {
// 如果写入范围与数据维度不匹配,可能需要调整或报错
// 这里简化处理,直接设置值,如果范围过大/小,Apps Script会自动处理
// 更严谨的做法是先获取目标范围的行/列数,再判断
// 或者使用 appendRow/appendRows
}
targetRange.setValues(dataToWrite);
return { success: true, message: "Data written successfully." };
} catch (e) {
return { error: e.message };
}
}部署Apps Script项目:
在Go应用程序中,我们将使用script.Service来调用Apps Script中定义的函数。
package main
import (
"context"
"fmt"
"log"
"net/http"
"google.golang.org/api/option"
"google.golang.org/api/script/v1"
)
// ... (getClient, getConfig等认证函数,如上所示)
func main() {
ctx := context.Background()
config, err := getConfig()
if err != nil {
log.Fatalf("无法获取OAuth配置: %v", err)
}
client := getClient(config)
srv, err := script.NewService(ctx, option.WithHTTPClient(client))
if err != nil {
log.Fatalf("无法初始化Apps Script服务: %v", err)
}
// 替换为您的Apps Script项目的部署ID
scriptID := "YOUR_APPS_SCRIPT_DEPLOYMENT_ID" // 例如:AKfycbyf...
// --- 示例:调用Apps Script函数读取数据 ---
spreadsheetID := "YOUR_SPREADSHEET_ID" // 您的Google Sheets文档ID
sheetName := "Sheet1"
readRange := "A1:C5"
readRequest := &script.RunRequest{
Function: "readSheetData", // Apps Script中定义的函数名
Parameters: []interface{}{
spreadsheetID,
sheetName,
readRange,
},
}
readResponse, err := srv.Scripts.Run(scriptID, readRequest).Do()
if err != nil {
log.Fatalf("执行Apps Script读取函数失败: %v", err)
}
if readResponse.Error != nil {
log.Fatalf("Apps Script执行返回错误: %v", readResponse.Error.Details)
}
if readResponse.Response != nil && readResponse.Response.Result != nil {
// 结果通常是map[string]interface{}类型,需要根据Apps Script返回的结构进行断言
resultMap, ok := readResponse.Response.Result.(map[string]interface{})
if !ok {
log.Printf("Apps Script返回结果非预期类型: %T", readResponse.Response.Result)
} else {
if success, found := resultMap["success"].(bool); found && success {
if data, dataFound := resultMap["data"].([]interface{}); dataFound {
fmt.Println("读取到的数据:")
for _, row := range data {
fmt.Println(row)
}
}
} else if errMsg, errFound := resultMap["error"].(string); errFound {
fmt.Printf("Apps Script执行失败: %s\n", errMsg)
}
}
}
// --- 示例:调用Apps Script函数写入数据 ---
writeRange := "A6"
valuesToWrite := [][]interface{}{
{"New Data 1", "New Data 2", "New Data 3"},
{"Row 2 Col 1", "Row 2 Col 2", "Row 2 Col 3"},
}
writeRequest := &script.RunRequest{
Function: "writeSheetData", // Apps Script中定义的函数名
Parameters: []interface{}{
spreadsheetID,
sheetName,
writeRange,
valuesToWrite,
},
}
writeResponse, err := srv.Scripts.Run(scriptID, writeRequest).Do()
if err != nil {
log.Fatalf("执行Apps Script写入函数失败: %v", err)
}
if writeResponse.Error != nil {
log.Fatalf("Apps Script执行返回错误: %v", writeResponse.Error.Details)
}
if writeResponse.Response != nil && writeResponse.Response.Result != nil {
resultMap, ok := writeResponse.Response.Result.(map[string]interface{})
if !ok {
log.Printf("Apps Script返回结果非预期类型: %T", writeResponse.Response.Result)
} else {
if success, found := resultMap["success"].(bool); found && success {
fmt.Printf("写入操作成功: %s\n", resultMap["message"])
} else if errMsg, errFound := resultMap["error"].(string); errFound {
fmt.Printf("Apps Script写入失败: %s\n", errMsg)
}
}
}
}通过Google Apps Script Execution API,Go语言开发者可以获得与Google Sheets进行深度交互的能力。这种方法结合了Go语言的强大并发处理能力和Google Apps Script对Google Workspace服务的原生支持,提供了一个灵活、可扩展且功能丰富的解决方案。掌握这种集成方式,将使您能够构建出更加智能和自动化的Go语言应用程序,有效管理和利用Google Sheets中的数据。
以上就是Go语言集成Google Sheets:数据读写实战的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号