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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

5097閲覧

Apps Script使用し、共有ドライブと共有ドライブ内のフォルダにメンバーと権限を追加する方法が知りたいです。

dell_0

総合スコア25

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

3クリップ

投稿2021/03/16 03:57

▼背景
共有ドライブ(旧チームドライブ)を近く作り、その中に60個近いフォルダを生成し、各フォルダごとに違うメンバーを1人追加し、かつ、権限の設定も行う必要があります。
手動でできなくはないのですが、数が多いので自動化したいです。

▼アウトプットイメージ
スプレッドシートに作成予定の共有ドライブ、共有ドライブ内のフォルダ、追加するアドレスの一覧を作り、メンバーと権限を追加したいと考えております。

var ss = SpreadsheetApp.getActiveSpreadsheet(); var createDriveSheet = ss.getSheetByName("共有ドライブ作成"); var updateDriveMemberSheet = ss.getSheetByName("共有ドライブ権限変更"); //実行メニューを作成 function onOpen() { var ui = SpreadsheetApp.getUi(); var menu = ui.createMenu("GAS実行"); menu.addItem("共有ドライブ作成", "createSharedDrive"); menu.addItem("共有ドライブメンバー変更", "updateDriveMember"); menu.addToUi(); } //Drive API v2を使用 function createSharedDrive() { var lastColum = createDriveSheet.getLastColumn(); var lastRow = createDriveSheet.getLastRow(); var startRow = 2; var numRows = lastRow - startRow + 1; var numColumns = lastColum ; var dataRange = createDriveSheet.getRange(startRow, 1, numRows, numColumns); var data = dataRange.getValues(); for (var i = 0; i < data.length; ++i) { var row = data[i]; row.rowNumber = i + 2; //Result列がブランクであれば処理を実行 if (!row[numColumns - 1]) { var result = ""; try { //同名の共有ドライブが作成できてしまうので、既に存在しないかチェックする。 var driveID = searchDriveIDbyName(row[0]); if(driveID=="Error") { throw "共有ドライブIDの取得でエラーが発生しました"; } else if(driveID=="Duplicate"){ throw "同じ名前の共有ドライブが複数存在します"; } else if(driveID=="Nothing") { var insertResources = { "name": row[0], }; //共有ドライブ設定の引数チェック var isAdminManagedRestrictions; var isDomainUsersOnly; var isDriveMembersOnly; var isCopyRequiresWriterPermission; if(row[1] == "true"){ isAdminManagedRestrictions = true; }else if(row[1] == "false") { isAdminManagedRestrictions = false; }else{ throw "引数の設定に誤りがあります"; } if(row[2] == "true"){ isDomainUsersOnly = true; }else if(row[2] == "false") { isDomainUsersOnly = false; }else{ throw "引数の設定に誤りがあります"; } if(row[3] == "true"){ isDriveMembersOnly = true; }else if(row[3] == "false") { isDriveMembersOnly = false; }else{ throw "引数の設定に誤りがあります"; } if(row[4] == "true"){ isCopyRequiresWriterPermission = true; }else if(row[4] == "false") { isCopyRequiresWriterPermission = false; }else{ throw "引数の設定に誤りがあります"; } var updateOptions = { "restrictions": { "adminManagedRestrictions": isAdminManagedRestrictions, "domainUsersOnly": isDomainUsersOnly, "driveMembersOnly": isDriveMembersOnly, "copyRequiresWriterPermission" : isCopyRequiresWriterPermission } }; //共有ドライブを作成 //requestIdが必須なので、UUIDを発行して渡す var uuid = Utilities.getUuid(); //実行するユーザーに共有ドライブ作成を管理コンソールの設定で許可しておかないとエラーになるので注意 var res = Drive.Drives.insert(insertResources, uuid); //共有ドライブの設定を更新 //共有ドライブの設定権限がないユーザーで実行すると、エラーが出ずに変更もされていないので注意 var updateResources = { "useDomainAdminAccess": true }; var res_update = Drive.Drives.update(updateResources, res.id, updateOptions); result = "Success"; }else { result = "同じ名前の共有ドライブが既に存在します"; } }catch(e){ result = "Error:" + e; } //実行結果をResult列にセット createDriveSheet.getRange(row.rowNumber, numColumns).setValue(result); } } } function updateDriveMember() { var lastColum = updateDriveMemberSheet.getLastColumn(); var lastRow = updateDriveMemberSheet.getLastRow(); var startRow = 2; var numRows = lastRow - startRow + 1; var numColumns = lastColum ; var dataRange = updateDriveMemberSheet.getRange(startRow, 1, numRows, numColumns); var data = dataRange.getValues(); for (var i = 0; i < data.length; ++i) { var row = data[i]; row.rowNumber = i + 2; //Result列がブランクであれば処理を実行 if (!row[numColumns - 1]) { var result = ""; try { //共有ドライブ名からのドライブIDを取得 var driveID = searchDriveIDbyName(row[0]); if(driveID=="Error") { result = "ドライブIDの取得でエラーが発生しました"; } else if(driveID=="Duplicate"){ result = "同じ名前の共有ドライブが複数存在します"; } else if(driveID=="Nothing") { result = "対象の共有ドライブが存在しません"; }else { if(row[2]=="add") { //対象の共有ドライブにメンバーを追加 //グループではなくユーザーで決め打ち //https://developers.google.com/drive/api/v3/reference/permissions/create var member = { "value": row[1], "type": "user", "role": row[3], }; var options = { "sendNotificationEmails" : false, "supportsAllDrives": true, "supportsTeamDrives": true, "useDomainAdminAccess": true, }; Drive.Permissions.insert(member, driveID, options); result = "Success"; } else if (row[2]=="remove") { //対象の共有ドライブのPermissionsを取得 var listOptions = { "supportsAllDrives": true, "supportsTeamDrives": true, "useDomainAdminAccess": true, }; var permissionList = Drive.Permissions.list(driveID, listOptions); //対象のメンバーを含むPermissionのみを抽出 var permission = permissionList.items.filter(function(perm) { return perm.emailAddress == row[1]; }); //対象の共有ドライブからメンバーを削除 var removeOptions = { "sendNotificationEmails" : false, "supportsAllDrives": true, "supportsTeamDrives": true, "useDomainAdminAccess": true, }; Drive.Permissions.remove(driveID, permission[0].id,removeOptions); result = "Success"; }else { result = "Actionの指定が正しくありません"; } } }catch(e){ result = "Error:" + e; } //実行結果をResult列にセット updateDriveMemberSheet.getRange(row.rowNumber, numColumns).setValue(result); } } } //引数で受け取った文字列の共有ドライブが存在する場合は"driveID"を、 //ドライブが存在しない場合は"Nothing"、 //複数のドライブが存在する場合は"Duplicate"、 //エラーが発生した場合は"Error"を返す function searchDriveIDbyName(driveName) { var driveID = ''; try { var options = { "q": "name='" + driveName + "'", "useDomainAdminAccess": true, }; var driveList = Drive.Drives.list(options); if(driveList.items.length==1) { driveID = driveList.items[0].id; } else if(driveList.items.length==0) { driveID ="Nothing"; } else { driveID ="Duplicate"; } }catch(e){ driveID = "Error"; } return driveID }

これで共有ドライブを自動生成し、メンバーと権限を割り当てることは出来たのですが、その生成した共有ドライブ内に新たにフォルダを複数つくり、メンバーと権限を割り当てたいです。

どのように編集すればよろしいか、ご教授いただけないでしょうか。
宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

私は試せないので上手く行くかわかりませんが、ネットの記事を参考にすれば出来る気がするのですがどうでしょう。

Google Apps Script(GAS)による共有ドライブの操作まとめ

「Googleドライブは「DriveApp」を、共有ドライブは「Drive」を、それぞれ使用します。」と記載されていてdell_0さん提示のコードでは「Drive」を使用していますよね。

Driveでは、フォルダの作成とメンバーの追加が出来ないのかな。正確にはしらないけど。

で、driveIDがわかっているようなので、DriveAppの「getFolderById(id)」が使えるんじゃないかと思います。
DriveAppには「createFolder(name)」メソッドがあるのでフォルダーは作れそうだし
戻り値で作ったフォルダーの「Folder」オブジェクトが取得できるようなので
後は、その「Folder」オブジェクトに対して
「addEditor」「addViewer」メソッドで権限をセットすれば出来るんじゃないかと想像します。

どうでしょうか。

投稿2021/03/16 22:09

編集2021/03/16 22:10
xail2222

総合スコア1497

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

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

dell_0

2021/03/17 05:48

ご回答ありがとうございます。 DriveAppをもう一度調べてみます。
guest

0

このサイトは使えると思います。
ちなみにサイトにも書いてありますが、タイムアウトに注意してください。

投稿2021/12/23 09:17

編集2021/12/23 09:27
eichahr

総合スコア26

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

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

dell_0

2021/12/23 09:24

ありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問