我想添加可以使用电子表格访问我网站的权限人员。 来自更多>分享&许可>添加我可以手动执行此操作的人员,但我在考虑是否可以将电子邮件地址放在电子表格中,并且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};
};
答案 0 :(得分:2)
编辑:更新了代码以解决两个问题。请参阅答案末尾添加的“问题”部分。
我没有看到任何做你正在描述的例子,但它应该是直截了当的实现。有相关课程和方法的文档。
查看Class Site
,here的方法。您将对处理站点上的查看器和编辑器权限的方法特别感兴趣:
此示例依赖于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。 两者都可以编写一个脚本来做你想做的事。