如何使用电子表格向Google网站添加权限?

时间:2014-01-09 13:29:12

标签: google-apps-script google-sheets google-sites

我想添加可以使用电子表格访问我网站的权限人员。 来自更多>分享&许可>添加我可以手动执行此操作的人员,但我在考虑是否可以将电子邮件地址放在电子表格中,并且Google网站会自动允许访问这些地址。

这可能吗?任何appscript /方式吗?如果是这样的文档/方式在哪里?有些谷歌搜索但找不到这样的数据。

更新 [网站必须“私有”才能工作removeViewer]以下代码可以成功添加&删除新观众。但是添加新行(电子邮件地址)时无法更新用户。它出现以下错误:“服务错误:SitesApp:AclEntry已存在已添加”

// 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};
};

2 个答案:

答案 0 :(得分:2)

编辑:更新了代码以解决两个问题。请参阅答案末尾添加的“问题”部分。
我没有看到任何做你正在描述的例子,但它应该是直截了当的实现。有相关课程和方法的文档。

查看Class Sitehere的方法。您将对处理站点上的查看器和编辑器权限的方法特别感兴趣:

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

此示例依赖于Javascript algorithm to find elements in array that are not in another array中的Array.uniqueFrom()方法。它希望您的电子表格在单元格A1中有一个标题,其中A列包含您要授予Viewer权限的电子邮件地址。

// 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};
};

问题

两个Google Apps问题使这个脚本变得复杂。访问并加注他们以增加他们修复的优先级。

  • Issue 3550:Site.getViewers()和Site.getEditors()不返回完整的共享列表。

    由于无法了解非Google用户,因此该脚本不会将其从“查看者”列表中删除。

  • Issue 3551:Site.addViewers()和Site.addEditors()不会忽略现有成员

答案 1 :(得分:0)

查看google apps sctipt sitesApp和spreadsheetApp。 两者都可以编写一个脚本来做你想做的事。