授權非管理員用戶在 Google Apps 腳本中運行 Admin SDK

里卡爾多

我想允許我們域中的非管理員用戶能夠使用運行代碼的 Google Sheet:

  • 列出我們組織中的一些團體
  • 刪除/添加用戶

這需要管理員權限,因此以下代碼不會在非管理員帳戶中運行...如何授權非管理員用戶運行管理員代碼?

var RatatoskSheet = SpreadsheetApp.getActiveSpreadsheet();

// -- ADD USER TO GROUP -- Set trigger to onedit -- //
function addUsertoGroup(e) {

   var sheet = e.source.getActiveSheet();
   if (sheet.getName() === 'AddUser') { //Hinders edits on other sheets

      var userData = SpreadsheetApp.getActive().getSheetByName('AddUser');
      var userEmail = userData.getRange(2, 1).getValue(); //Gets data from AddUser.A2
      var groupId = userData.getRange(2, 2).getValue(); //Gets data from cell B2

      var newMember = {
         email: userEmail,
         role: "MEMBER"
      };


      AdminDirectory.Members.insert(newMember, groupId); // Adds new member to a Google group
      var groupData = SpreadsheetApp.getActive().getSheetByName('GroupAddress');
      var groupTwo = [userEmail, groupId]
      groupData.appendRow(groupTwo); //Add member and group to GroupAddress
      var header = ['UserEmail', 'GroupID'];
      userData.clear(); //Reset AddUser (Delete all)
      userData.appendRow(header).setFrozenRows(1);



   }
}

// -- REMOVE USER FROM GROUP -- Set trigger of this function to onedit -- //
function deleteGroupMember(e) {

   var sheet = e.source.getActiveSheet();
   if (sheet.getName() === 'RemoveUser') { //Hinders edits on other sheets

      var RemoveUserData = SpreadsheetApp.getActive().getSheetByName('RemoveUser');
      var groupData = SpreadsheetApp.getActive().getSheetByName('GroupAddress');

      var userEmail = RemoveUserData.getRange(2, 1).getValue(); //Gets data from RemoveUser.A2
      var groupId = RemoveUserData.getRange(2, 2).getValue(); //Gets data from  RemoveUser.B2

      AdminDirectory.Members.remove(groupId, userEmail); //Removes member from a Google group

      var removeDataValues = RemoveUserData.getDataRange().getValues();
      var groupDataValues = groupData.getDataRange().getValues();
      var resultArray = [];
      for (var n in groupDataValues) { //
         var keep = true
         for (var p in removeDataValues) {
            if (groupDataValues[n][0] == removeDataValues[p][0] && groupDataValues[n][1] == removeDataValues[p][1]) {
               keep = false;
               break;
            }
         }
         if (keep) {
            resultArray.push(groupDataValues[n])
         };
      }


      var start = 2; //Starts from Row 2          //
      var killTheRows = groupData.getLastRow() - start + 1; //                           // These lines deletes all rows in GroupAddress
      groupData.deleteRows(start, killTheRows); //Delete all rows with values//

      groupData.getRange(2, 1, resultArray.length, resultArray[0].length).setValues(resultArray); //Repopulate the rows in GroupAddress

      var header = ['UserEmail', 'GroupID'];
      RemoveUserData.clear();
      RemoveUserData.appendRow(header).setFrozenRows(1);



   }
}

// -- LISTS ALL GROUPS AND USERS WITHIN THEM -- Set this as a timed trigger to error correct once a day -- //
function listAllGroups() {
   var grouprows = [];
   var pageToken;

   var page;
   do {
      page = AdminDirectory.Groups.list({
         domain: 'THEDOMAIN',
         maxResults: 200,
         pageToken: pageToken
      });
      var groups = page.groups;
      if (groups) {
         for (var i = 0; i < groups.length; i++) {
            var group = groups[i];
            if (group.email.substring(0, 5) === "staff") {
               grouprows.push(group.email);
            }
         }
      }
      pageToken = page.nextPageToken;
   } while (pageToken);

   var rows = [];
   var pageToken, page2;
   for (var j = 0; j < grouprows.length; j++) {
      do {
         page2 = AdminDirectory.Members.list(grouprows[j], {
            domainName: 'YOURDOMAIN',
            maxResults: 500,
            pageToken: pageToken,
         });
         var members = page2.members;
         if (members) {
            for (var i = 0; i < members.length; i++) {
               var member = members[i];
               var row = [member.email, grouprows[j]];
               rows.push(row);
            }
         }
         pageToken = page2.nextPageToken;
      } while (pageToken);
      if (rows.length > 1) {
         var groupData = RatatoskSheet.getSheetByName("GroupAddress");
         var header = ['UserEmail', 'GroupID'];
         groupData.clear();
         groupData.appendRow(header).setFrozenRows(1);
         groupData.getRange(2, 1, rows.length, header.length).setValues(rows);

      }

   }
   groupData.deleteRow(2); //NB! Removes first group([email protected]) Make this whole line a comment if unsure. 



} 
ale13

實現此目的的一種方法是創建服務帳戶並使用域範圍的授權委託。

之後,由於您想繼續使用 Apps 腳本,因此您必須獲取此服務帳戶的訪問令牌並使用它發出請求,UrlFetchApp因為在使用 Admin SDK Directory 高級服務發出請求時無法傳遞訪問令牌。

因此,請求最終看起來類似於:

var options = {
    method: "GET",
    contentType: "application/json",
    muteHttpExceptions: true,
};

var response = UrlFetchApp.fetch('https://admin.googleapis.com/admin/directory/v1/groups/{groupKey}/members', {
    headers: {
      Authorization: 'Bearer ' + token
    }
  });

但是,此方法可能取決於您為帳戶設置的限制。

另一種選擇是將您的腳本部署為 Web 應用程序

對於部署 Web 應用程序,腳本應包含 adoGet(e)或 adoPost(e)並返回 HTML 服務對HtmlOutput像或內容服務TextOutput對象。

執行此操作後,您應該使用以下設置部署 Web 應用程序:

  • 執行為:

  • 誰有權訪問:域內的任何人

參考

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Google Web Apps - 獲取用戶電子郵件但以所有者身份運行腳本

將 Apps 腳本函數應用於 Google 表格中的其他行

PHP中的Google Admin SDK

Google Apps 腳本運行速度很慢

通过Admin SDK将自定义属性/值添加到Google Apps Acount

使用邮递员+ oauth2访问Google Apps Admin SDK

Google Apps Admin Java API中的批处理操作

有沒有辦法在 Google Apps 腳本中每隔幾秒調用一次函數?

Google Admin SDK目录API(Java)中的members.list()

如何在Google Admin SDK中查找用户

在PHP中显示Google Admin SDK JSON响应

清除 Google Admin SDK API 中的 DATE 字段

我可以在 Google Drive 中的文件上運行腳本嗎?

授權google api請求列出用戶

Google Apps 腳本:將軟換行符替換為硬換行符

Google Workspace - 創建空間 - Google Apps 腳本

有沒有辦法在 Google Apps 腳本中每隔幾秒調用一次自定義函數?

google admin sdk目录api 403 python

如何使用 Google Apps 腳本重新格式化二維數組中的日期?

從 Google Apps 腳本中刪除禁用的觸發器

Google Apps 腳本在執行日誌中返回所需的結果,但電子表格中的單元格為空

Google Apps 腳本解壓文件 - 問題

聲明 Google Apps 腳本變量的最佳做法

Google Apps 腳本 - 如何解析響應

在Java中使用admin sdk api在google应用中创建用户

使用 Apps 腳本刪除可見行的非迭代解決方案?

如何“重置”在使用 Flask 應用程序數據庫的 Python 腳本中運行的 db.session?

在工作表之間傳輸大量行的更有效方法 - Google Apps 腳本

通过Google进行身份验证以使用Admin SDK中的Google Directory API的正确方法是什么?