How to add permission to Google site using spreadsheet?

倾然丶 夕夏残阳落幕 提交于 2019-12-08 09:35:07

问题


I want to add permission people who can access my site using spreadsheet. From More>Sharing & Permission > Add people I can do that manually but I'm thinking if its possible I place email address whom to share on a spreadsheet and Google site automatically allow access to them.

Is that possible? Any appscript/way to do that? If so where is the documentation/way to do that? Did some Google search but couldn't find such data.

Update [Site must be "Private" to work removeViewer] Following code can successfully add & delete new viewers. But it can't update users when new row (email address) is added. It gives following error: "Service error: SitesApp: AclEntry already exists added"

// These globals should be customized for your site   
    var domain = '';  // Leave blank for consumer account

    /**
     * Adds a custom menu to the active spreadsheet, containing a single menu item
     */

    function onOpen() {
      var sheet = SpreadsheetApp.getActiveSpreadsheet();
      var entries = [{
        name : "Update Viewers",
        functionName : "updateSiteViewersUI"
      }];
      sheet.addMenu("Site Utilities", entries);
    };


/**
 * Spreadsheet UI wrapper for updateSiteViewers()
 */
function updateSiteViewersUI() {
  var result = updateSiteViewers();
  Browser.msgBox('Site Viewers updated', 
                 'Added: '+result.added+'\\nRemoved:'+result.removed,
                 Browser.Buttons.OK)
}

/**
 * Reads email addresses from Column A, skipping a header line, and uses
 * them to update Viewer permissions on the Google Site.
 */
function updateSiteViewers() {  
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var values = rows.getValues();

  // Get user list from sheet
  var sheetUsers = [];
  for (var i = 1; i < values.length; i++) {
    var row = values[i];
    sheetUsers.push(row[0]); // build array of users
  }

  // uniqueFrom 
  Array.prototype.uniqueFrom = function() {
  if (!arguments.length)
    return [];
  var a1 = this.slice(0); // Start with a copy

  for (var n=0; n < arguments.length; n++) {
    var a2 = arguments[n];
    if (!(a2 instanceof Array))
      throw new TypeError( 'argument ['+n+'] must be Array' );

    for(var i=0; i<a2.length; i++) {
      var index = a1.indexOf(a2[i]);
      if (index > -1) {
        a1.splice(index, 1);
      } 
    }
  }
  return a1;
}
  // Get user list from consumer site
  var site = SitesApp.getSiteByUrl("https://sites.google.com/site/xyz/");
 Logger.log(site.getName());   
  var siteViewers = site.getViewers();

  /**
 * Returns a non-destructive Array of elements that are not found in
 * any of the parameter arrays.
 *
 * @param {...Array} var_args   Arrays to compare.
 */

  // Compare lists to find out what work we need to do
  var viewersToAdd = sheetUsers.uniqueFrom(siteViewers);
  var viewersToRemove = siteViewers.uniqueFrom(sheetUsers);

  // Update the Viewers list
  // Note - We could just add everyone, since the API ignores duplicates,
  // but then we wouldn't know how many changes there were.
  site.addViewers(viewersToAdd);

  for (var j=0; j < viewersToRemove.length; j++) {
    site.removeViewer(viewersToRemove[j]);
  }

  return {added:viewersToAdd.length, removed:viewersToRemove.length};
};

回答1:


Edit: Code updated to address two issues. See "Issues" section added at end of answer.
I haven't seen any examples that do what you're describing, but it should be straight-forward to implement. There is documentation for the classes and methods involved.

Look at the methods for Class Site, here. You will be especially interested in the methods dealing with viewer and editor permissions on sites:

  • Site.getViewers()
  • Site.getEditors()
  • Site.addViewer()
  • Site.addEditor()
  • Site.removeViewer()
  • Site.removeEditor()

This example relies on the Array.uniqueFrom() method from Javascript algorithm to find elements in array that are not in another array. It expects your spreadsheet to have a header in cell A1, with column A containing email addresses that you want to grant Viewer permissions to.

// These globals should be customized for your site
var domain = 'yourdomain.com';  // Leave blank for consumer account
var sitename = 'your_site';

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Update Viewers",
    functionName : "updateSiteViewersUI"
  }];
  sheet.addMenu("Site Utilities", entries);
};

/**
 * Spreadsheet UI wrapper for updateSiteViewers()
 */
function updateSiteViewersUI() {
  var result = updateSiteViewers();
  Browser.msgBox('Site Viewers updated', 
                 'Added: '+result.added+'\\nRemoved:'+result.removed,
                 Browser.Buttons.OK)
}

/**
 * Reads email addresses from Column A, skipping a header line, and uses
 * them to update Viewer permissions on the Google Site.
 */
function updateSiteViewers() {  
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var values = rows.getValues();
  var sheetUsers = [];

  // Get user list from sheet
  for (var i = 1; i < values.length; i++) {
    var row = values[i];
    sheetUsers.push(row[0]); // build array of users
  }

  // Get user list from site
  var site = (domain === '')
             ? SitesApp.getSite(sitename)           // consumer
             : SitesApp.getSite(domain, sitename ); // hosted apps
  var siteViewers = site.getViewers().join(',').split(',');
  var editors = site.getEditors()
  var owners = site.getOwners()
  var viewersToAdd = sheetUsers.uniqueFrom(siteViewers);
  var viewersToRemove = siteViewers.uniqueFrom(sheetUsers);
  var addErrors = 0; // Counter for exceptions

  // Update the Viewers list
  for (var i=0; i < viewersToAdd.length; i++) {
    try {
      site.addViewer(viewersToAdd[i]);
    }
    catch (e) {
      // May receive Service error: SitesApp: AclEntry already exists
      // If a non-google user is a Viewer, they are not reported
      // by getViewers(). Bummer. We'll ignore just those errors.
      addErrors++; // Count the error
      if (e.message !== "Service error: SitesApp: AclEntry already exists") {
        throw e;
      }
    }
  }

  for (var i=0; i < viewersToRemove.length; i++) {
    site.removeViewer(viewersToRemove[i]);
  }

  return {added:viewersToAdd.length-addErrors, removed:viewersToRemove.length, errors:addErrors};
};

Issues

Two Google Apps Issues have complicated this script. Visit and star them to increase the priority that they get fixed.

  • Issue 3550: Site.getViewers() and Site.getEditors() do not return complete sharing list.

    Because it cannot find out about non-google users, this script will not remove them from the Viewers list.

  • Issue 3551: Site.addViewers() and Site.addEditors() do not ignore existing members




回答2:


Look at google apps sctipt sitesApp and spreadsheetApp. With both you can write a script to do what you want.



来源:https://stackoverflow.com/questions/21021616/how-to-add-permission-to-google-site-using-spreadsheet

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!