質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Q&A

解決済

1回答

3956閲覧

GoogleDriveApi新規フォルダ作成時にデフォルトのパーミッションがおかしい

tomagurosu

総合スコア37

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

0グッド

0クリップ

投稿2018/10/19 01:07

下記GoogleApiを用いて新規のフォルダ作成を試みたコードになります。
新規フォルダの作成は成功し、作成されたフォルダーのFile構造体がresponseに帰ってくることは確認できたのですが、driveをブラウザ上で確認しても該当フォルダが作成されていませんでした。

responseのファイルIDからブラウザで確認してみたのですが、権限が足りない旨のエラーが出てしまいます....

どなたかアドバイスお願いいたします。

Go

1 2package main 3 4import ( 5 "fmt" 6 "io/ioutil" 7 "log" 8 "net/http" 9 10 "golang.org/x/oauth2" 11 "golang.org/x/oauth2/google" 12 "google.golang.org/api/drive/v3" 13) 14 15const ( 16 credentialFilePath = "" 17) 18 19func main() { 20 client := getClient(credentialFilePath) 21 driveService, _ := drive.New(client) 22 folder := &drive.File{} 23 folder.Name = "testFolder" 24 folder.MimeType = "application/vnd.google-apps.folder" 25 res, err := driveService.Files.Create(folder).Do() 26 if err != nil { 27 log.Fatal(err) 28 } 29 fmt.Println(res) 30} 31 32func getClient(credentialFilePath string) *http.Client { 33 credentialInfo, err := ioutil.ReadFile(credentialFilePath) 34 if err != nil { 35 log.Fatal(err) 36 } 37 38 config, err := google.JWTConfigFromJSON(credentialInfo, drive.DriveFileScope) 39 if err != nil { 40 log.Fatal(err) 41 } 42 43 return config.Client(oauth2.NoContext) 44} 45

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自分のアカウントで作成したサービスアカウントは、自分のアカウントとは別のアカウントとして使用されます。そのため、サービスアカウントで作成したフォルダは、自分のアカウントでログインしたGoogle Drive上には現れません。これは仕様です。

ここでは、質問の内容からサンプルとして、サービスアカウントで作成したフォルダを自分のアカウントのGoogle Drive上で通常通り使用したいとした場合を想定します。

これを満たすためにはフォルダのパーミッションを変更する必要があります。フォルダ作成時にパーミッションを変更することはできないため、フォルダを作成した後にパーミッションを変更します。サンプルスクリプトは次のようになります。表示されているスクリプトのmain()を変更します。

go

1func main() { 2 client := getClient(credentialFilePath) 3 driveService, _ := drive.New(client) 4 folder := &drive.File{} 5 folder.Name = "testFolder" 6 folder.MimeType = "application/vnd.google-apps.folder" 7 res, err := driveService.Files.Create(folder).Do() 8 if err != nil { 9 log.Fatal(err) 10 } 11 fmt.Println(res) 12 13 // 下記でパーミッションを変更して所有者を自分に変更します。 14 permission := &drive.Permission{ 15 EmailAddress: "ログインで使用している自分のメールアドレス", 16 Role: "owner", 17 Type: "user", 18 } 19 res2, err := driveService.Permissions.Create(res.Id, permission).TransferOwnership(true).Do() 20 if err != nil { 21 log.Fatal(err) 22 } 23 fmt.Println(res2) 24}

このサンプルでは、サービスアカウントで作成したフォルダの所有者を自分のアカウントに切り替えています。このとき、TransferOwnership(true)に設定する必要があります。このスクリプトを実行すると、ブラウザからGoogle DriveのルートへtestFolderのフォルダが作成されていることが分かります。そして、共有者として、サービスアカウントのメールアドレスを確認することができるかと思います。

もしも、サービスアカウントで作成したフォルダの所有者をそのままにしたい場合は、roleを変更し、さらに自分のGoogle Drive上で見たい場合は、typeをwriterにし、アップデートとしてparentフォルダを追加してください。

参考

解決のための参考になれば幸いです。

投稿2018/10/19 04:52

kisojin

総合スコア899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問