You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Golang SDK分享服务账号创建的Google Doc?

解决服务账号创建Google Doc后无法分享给个人账号的问题

你遇到的问题根源在于:Google Docs API仅负责文档的创建与内容编辑,文档的权限管理由Google Drive API负责,因此需要通过Drive API实现分享操作。以下是具体解决方案:

步骤说明

  1. 引入Drive API依赖:添加Drive SDK导入,并扩展JWT认证的权限范围,包含Drive相关权限。
  2. 创建Drive服务实例:使用已有的服务账号客户端初始化Drive服务。
  3. 添加文档权限:在创建文档后,调用Drive API的权限接口,将文档分享给指定个人账号。

修改后的完整代码

package googledoc

import (
	"context"
	"fmt"

	log "github.com/sirupsen/logrus"
	"golang.org/x/oauth2/google"
	"google.golang.org/api/docs/v1"
	"google.golang.org/api/drive/v3"
	"google.golang.org/api/option"
)

func CreateDocAndShare(title string, shareEmail string, role string) error {
	ctx := context.Background()
	cred, err := GetSecrets("ap-south-1", "GOOGLE_SVC_ACC_JSON")
	if err != nil {
		return fmt.Errorf("unable to get the SSM %v", err)
	}

	// 扩展权限范围,包含Docs和Drive的必要权限
	scopes := []string{
		docs.DocumentsScope,
		drive.DriveScope, // 若需更严格权限,可替换为drive.DriveFileScope仅针对创建的文件
	}
	config, err := google.JWTConfigFromJSON(cred, scopes...)
	if err != nil {
		log.Fatalf("Unable to parse client secret file to config: %v", err)
	}
	client := config.Client(ctx)

	// 初始化Docs服务
	srv, err := docs.NewService(ctx, option.WithHTTPClient(client))
	if err != nil {
		log.Fatalf("Unable to retrieve Docs client: %v", err)
	}

	docObj := docs.Document{
		Title: title,
	}
	doc, err := srv.Documents.Create(&docObj).Do()
	if err != nil {
		log.Fatalf("Unable to create document: %v", err)
		return err
	}
	fmt.Printf("Created doc: %s (ID: %s)\n", doc.Title, doc.DocumentId)

	// 初始化Drive服务
	driveSrv, err := drive.NewService(ctx, option.WithHTTPClient(client))
	if err != nil {
		log.Fatalf("Unable to retrieve Drive client: %v", err)
		return err
	}

	// 构造权限请求:分享给指定个人账号
	permission := &drive.Permission{
		Type:         "user",          // 分享类型:user/group/domain/anyone
		EmailAddress: shareEmail,      // 目标个人账号邮箱
		Role:         role,            // 权限角色:owner/writer/reader/commenter等
	}
	_, err = driveSrv.Permissions.Create(doc.DocumentId, permission).Do()
	if err != nil {
		log.Fatalf("Unable to set document permission: %v", err)
		return err
	}
	fmt.Printf("Successfully shared doc with %s (role: %s)\n", shareEmail, role)

	return nil
}

关键说明

  • 权限范围选择:drive.DriveScope是全权限范围,若遵循最小权限原则,可替换为drive.DriveFileScope,仅允许操作服务账号创建的文件。
  • 角色参数:role支持的值包括reader(只读)、writer(可编辑)、owner(转让所有权,需注意服务账号转让后可能失去访问权限)等。
  • 权限类型:除user外,还支持group(分享给谷歌群组)、domain(分享给整个域名)、anyone(公开分享)。

内容的提问来源于stack exchange,提问作者Nupur Thakur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:15:52