如何通过Golang SDK分享服务账号创建的Google Doc?
解决服务账号创建Google Doc后无法分享给个人账号的问题
你遇到的问题根源在于:Google Docs API仅负责文档的创建与内容编辑,文档的权限管理由Google Drive API负责,因此需要通过Drive API实现分享操作。以下是具体解决方案:
步骤说明
- 引入Drive API依赖:添加Drive SDK导入,并扩展JWT认证的权限范围,包含Drive相关权限。
- 创建Drive服务实例:使用已有的服务账号客户端初始化Drive服务。
- 添加文档权限:在创建文档后,调用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
相关产品推荐
相关产品推荐

