如何使用电子表格为Google网站添加权限? [英] How to add permission to Google site using spreadsheet?

查看:152
本文介绍了如何使用电子表格为Google网站添加权限?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想添加可以使用电子表格访问我的网站的权限人员。
从更多>分享&权限>添加我可以手动完成的人员,但我在考虑是否可以将电子表格和Google网站上的人员共享的电子邮件地址自动允许他们访问。



这可能吗?任何的脚本/方式来做到这一点?如果是这样的文件/方式在哪里呢?做了一些谷歌搜索,但无法找到这样的数据。

$ p $更新 [网站必须是私人才能运行removeViewer]以下代码可以成功添加&删除新的观众。但是当添加新行(电子邮件地址)时,它不能更新用户。它给出了以下错误:服务错误:SitesApp:AclEntry已经存在添加

  //这些全局变量应该为您的站点定制
var domain =''; //为消费者帐户保留为空

/ **
*为活动电子表格添加一个自定义菜单,其中包含一个菜单项
* /

function onOpen(){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name:Update Viewers,
functionName:updateSiteViewersUI
}];
sheet.addMenu(网站实用程序,条目);
};

$ b / **
* updateSiteViewers()的电子表格UI包装器()
* /
函数updateSiteViewersUI(){
var result = updateSiteViewers ();
Browser.msgBox('Site Viewers updated',
'Added:'+ result.added +'\\\\
Removed:'+ result.removed,
Browser.Buttons.OK)

$ b $ ** b $ b *从列A中读取电子邮件地址,跳过标题行,并使用
*它们更新Google网站上的查看者权限。
* /
函数updateSiteViewers(){
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getDataRange();
var values = rows.getValues();

//从表单获取用户列表
var sheetUsers = [];
for(var i = 1; i< values.length; i ++){
var row = values [i];
sheetUsers.push(row [0]); //构建用户数组

$ b // uniqueFrom
Array.prototype.uniqueFrom = function(){
if(!arguments.length)
return [];
var a1 = this.slice(0); //从一个副本开始

(var n = 0; n< arguments.length; n ++){
var a2 = arguments [n];
if(!(a2 instanceof Array))
throw new TypeError('argument ['+ n +'] must Array'); (var i = 0; i< a2.length; i ++){
var index = a1.indexOf(a2 [i])的

;
if(index> -1){
a1.splice(index,1);
}
}
}
返回a1;
}
//从用户网站获取用户列表
var site = SitesApp.getSiteByUrl(https://sites.google.com/site/xyz/);
Logger.log(site.getName());
var siteViewers = site.getViewers();

/ **
*返回在
*中没有的任何参数数组中找不到的非破坏性元素数组。
*
* @param {... Array} var_args要进行比较的数组。
* /

//比较列表以找出我们需要做的工作
var viewersToAdd = sheetUsers.uniqueFrom(siteViewers);
var viewersToRemove = siteViewers.uniqueFrom(sheetUsers);

//更新观众列表
//注意 - 我们可以添加每个人,因为API忽略了重复的
//但是我们不知道有多少变化曾经有。
site.addViewers(viewersToAdd); (var j = 0; j< viewersToRemove.length; j ++){
site.removeViewer(viewersToRemove [j]);


}

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


解决方案

编辑:代码更新以解决两个问题。请参阅答案末尾添加的问题部分。

我没有看到任何可以执行您所描述内容的示例,但它应该是直接实施的。有关类和方法的文档。



查看 Class Site 的方法,此处。您将特别感兴趣的方式处理网站上的查看器和编辑器权限:


  • Site.getViewers()

  • Site.adEditor()

  • Site.addViewer()

  • Site.removeViewer()

  • Site.removeEditor()



Array.uniqueFrom()方法-array-that-are-in-another-array / 21024816#21024816> Javascript算法来查找不在另一个数组中的元素。它希望您的电子表格在单元格A1中有一个标题,列A包含您希望授予查看者权限的电子邮件地址。

  //这些全局变量应该为您的网站定制
var domain ='yourdomain.com'; //留空为消费者帐户
var sitename ='your_site';
$ b / **
*向活动电子表格添加一个自定义菜单,其中包含一个菜单项
* /
function onOpen(){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name:Update Viewers,
functionName:updateSiteViewersUI
}];
sheet.addMenu(网站实用程序,条目);
};
$ b / **
* updateSiteViewers()的电子表格UI包装器()
* /
函数updateSiteViewersUI(){
var result = updateSiteViewers();
Browser.msgBox('Site Viewers updated',
'Added:'+ result.added +'\\\\
Removed:'+ result.removed,
Browser.Buttons.OK)

$ b $ ** b $ b *从列A中读取电子邮件地址,跳过标题行,并使用
*它们更新Google网站上的查看者权限。
* /
函数updateSiteViewers(){
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getDataRange();
var values = rows.getValues();
var sheetUsers = [];

//从表单
获取用户列表(var i = 1; i< values.length; i ++){
var row = values [i];
sheetUsers.push(row [0]); //建立用户数组
}

//从站点获取用户列表
var site =(domain ==='')
? SitesApp.getSite(sitename)//消费者
:SitesApp.getSite(domain,sitename); //托管应用程序
var siteViewers = site.getViewers()。join(',')。split(',');
var editors = site.getEditors()
var owner = site.getOwners()
var viewersToAdd = sheetUsers.uniqueFrom(siteViewers);
var viewersToRemove = siteViewers.uniqueFrom(sheetUsers);
var addErrors = 0; //计数器例外

//更新查看器列表
for(var i = 0; i< viewersToAdd.length; i ++){
try {
site.addViewer(viewersToAdd [I]);
}
catch(e){
//可能会收到服务错误:SitesApp:AclEntry已存在
//如果非谷歌用户是查看者,则不会报告
// getViewers()。游民。我们将忽略这些错误。
addErrors ++; //计算错误
if(e.message!==Service error:SitesApp:AclEntry already exists){
throw e; $ var




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

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






问题



两个「Google应用服务问题」使这个脚本变得复杂。访问并给它们加星标,以提高它们获得修复的优先级。


  • Issue 3550 :Site.getViewers()和Site.getEditors()共享列表。



    由于无法找到非谷歌用户,因此此脚本不会将其从查看者列表中删除。

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



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

解决方案

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

这篇关于如何使用电子表格为Google网站添加权限?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆