如何使用电子表格为Google网站添加权限? [英] How to add permission to Google site using spreadsheet?
问题描述
我想添加可以使用电子表格访问我的网站的权限人员。
从更多>分享&权限>添加我可以手动完成的人员,但我在考虑是否可以将电子表格和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()
//这些全局变量应该为您的网站定制
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()共享列表。 由于无法找到非谷歌用户,因此此脚本不会将其从查看者列表中删除。 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屋!