阻止用户的某些 sheet 操作
Prevent some sheet actions by users
我已将 "Edit" 权限授予某些用户。我是楼主。
我通过保护 Row1(只能由所有者编辑)来阻止添加或删除或隐藏或调整列(由用户)。
但是,我看到用户添加了一些虚拟 sheet。我可以通过每天运行一次的脚本删除这些 sheet。有没有更好的方法来防止用户添加 sheet?
如果一个用户(编辑者)删除了一个sheet,系统就会崩溃。如何防止编辑器删除 sheet?这对我来说很重要。
一些用户按下底部的 "Add 1000 rows" 按钮并添加不需要的行。有办法防止吗?现在,我在菜单中做了一个删除空行的选项。
我认为没有一种方法可以通过这种方式轻松“保护”您的传播sheet。但是,您可以将 onChange
触发器添加到您的传播sheet(阅读更多内容 here),这将 运行 每当有人更改传播的格式或结构时触发 sheet。在脚本编辑器中,单击 edit
> current project's triggers
,这将打开一个新的 window。您可以在那里添加一个新触发器(select 一个要执行的函数和传播sheet 事件onChange
)。这是您可以 link 触发的功能:
function onChange(e) {
/* e is the event object, see documentation */
if (e.changeType == "INSERT_ROW") {
/* delete unneeded empty rows at the end */
removeEmptyRows();
} else if (e.changeType == "INSERT_GRID") {
/* delete unwanted sheets */
removeExtraSheets();
}
}
至于防止用户删除 sheet,似乎没有办法做到这一点。您可以在 onChange
函数中捕获 sheet 的删除,changeType
将是 "REMOVE_GRID"
但事件对象不允许您访问已删除的数据。
因此,如果您在 sheet 中有重要数据(并且不要相信编辑 不会 删除 sheet 中的数据),您可能应该定期备份数据(使用基于时间的触发器和只有您可以访问的第二个备份传播sheet)。
答案:
您无法阻止具有编辑权限的用户创建新的 Sheet 或行,但您可以 运行 一个 onChange()
触发器来删除它们一旦它们被创建。
更多信息:
onChange()
trigger of Google Sheets 是一个可安装的触发器,当对 Sheet 的结构进行更改时,它会 运行s。
chenged 事件的 event object 包含有关更改类型的信息 - 特别是 INSERT_GRID
和 INSERT_ROW
- 这些指的是新的 Sheet 结构更改Sheet 添加并插入新行或行范围。
从这里您可以处理立即删除它们。
代码:
function onChange(e) {
if (e.changeType == "INSERT_GRID") {
// list your sheet names in here:
var sheetNames = ["Sheet1", "Sheet2", "Sheet3"];
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
if (sheets.length != sheetNames.length) {
for (var i = 0; i < sheets.length; i++) {
if (sheetNames.includes(sheets[i].getName())) {
continue;
}
else {
SpreadsheetApp.getActiveSpreadsheet().deleteSheet(sheets[i])
}
}
}
}
else if (e.changeType == "INSERT_ROW") {
// define how many rows your sheet has here:
var noOfRows = 200;
var sheet = SpreadsheetApp.getActive();
sheet.getRange((noOfRows + 1) + ':' + (noOfRows + 1)).activate();
var currentCell = sheet.getCurrentCell();
sheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
sheet.getActiveSheet().deleteRows(sheet.getActiveRange().getRow(), sheet.getActiveRange().getNumRows());
}
}
设置触发器:
使用保存图标保存脚本,按 运行 按钮 (►),并确认 运行 脚本的身份验证。
从这里开始,在编辑 > 当前项目的触发器菜单项之后,您将在 G Suite 开发人员中心打开一个新页面。点击右下角的+添加触发器按钮,设置触发器设置如下:
- 选择要运行的函数:
onChange
- 选择应 运行 的部署:
Head
- Select 事件来源:
From spreadsheet
- Select 事件类型:
On change
然后按保存。
已删除 Sheets:
这是棘手的部分;不幸的是,无法通过使用 onChange()
.
捕获已删除的 sheet 来恢复它们
然而,如果这是一个非常重要的事情,我可以推荐的最好的事情是看一下 file revisions of Drive files and the Drive API's file revisions: list
and revisions: get
方法,并在 e.changeType == REMOVE_GRID
上做一些整合,但实际上你应该尽可能多地尝试和备份 sheet,这样如果重要的结构丢失,它可以很容易地恢复。
参考文献:
我已将 "Edit" 权限授予某些用户。我是楼主。
我通过保护 Row1(只能由所有者编辑)来阻止添加或删除或隐藏或调整列(由用户)。
但是,我看到用户添加了一些虚拟 sheet。我可以通过每天运行一次的脚本删除这些 sheet。有没有更好的方法来防止用户添加 sheet?
如果一个用户(编辑者)删除了一个sheet,系统就会崩溃。如何防止编辑器删除 sheet?这对我来说很重要。
一些用户按下底部的 "Add 1000 rows" 按钮并添加不需要的行。有办法防止吗?现在,我在菜单中做了一个删除空行的选项。
我认为没有一种方法可以通过这种方式轻松“保护”您的传播sheet。但是,您可以将 onChange
触发器添加到您的传播sheet(阅读更多内容 here),这将 运行 每当有人更改传播的格式或结构时触发 sheet。在脚本编辑器中,单击 edit
> current project's triggers
,这将打开一个新的 window。您可以在那里添加一个新触发器(select 一个要执行的函数和传播sheet 事件onChange
)。这是您可以 link 触发的功能:
function onChange(e) {
/* e is the event object, see documentation */
if (e.changeType == "INSERT_ROW") {
/* delete unneeded empty rows at the end */
removeEmptyRows();
} else if (e.changeType == "INSERT_GRID") {
/* delete unwanted sheets */
removeExtraSheets();
}
}
至于防止用户删除 sheet,似乎没有办法做到这一点。您可以在 onChange
函数中捕获 sheet 的删除,changeType
将是 "REMOVE_GRID"
但事件对象不允许您访问已删除的数据。
因此,如果您在 sheet 中有重要数据(并且不要相信编辑 不会 删除 sheet 中的数据),您可能应该定期备份数据(使用基于时间的触发器和只有您可以访问的第二个备份传播sheet)。
答案:
您无法阻止具有编辑权限的用户创建新的 Sheet 或行,但您可以 运行 一个 onChange()
触发器来删除它们一旦它们被创建。
更多信息:
onChange()
trigger of Google Sheets 是一个可安装的触发器,当对 Sheet 的结构进行更改时,它会 运行s。
chenged 事件的 event object 包含有关更改类型的信息 - 特别是 INSERT_GRID
和 INSERT_ROW
- 这些指的是新的 Sheet 结构更改Sheet 添加并插入新行或行范围。
从这里您可以处理立即删除它们。
代码:
function onChange(e) {
if (e.changeType == "INSERT_GRID") {
// list your sheet names in here:
var sheetNames = ["Sheet1", "Sheet2", "Sheet3"];
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
if (sheets.length != sheetNames.length) {
for (var i = 0; i < sheets.length; i++) {
if (sheetNames.includes(sheets[i].getName())) {
continue;
}
else {
SpreadsheetApp.getActiveSpreadsheet().deleteSheet(sheets[i])
}
}
}
}
else if (e.changeType == "INSERT_ROW") {
// define how many rows your sheet has here:
var noOfRows = 200;
var sheet = SpreadsheetApp.getActive();
sheet.getRange((noOfRows + 1) + ':' + (noOfRows + 1)).activate();
var currentCell = sheet.getCurrentCell();
sheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
sheet.getActiveSheet().deleteRows(sheet.getActiveRange().getRow(), sheet.getActiveRange().getNumRows());
}
}
设置触发器:
使用保存图标保存脚本,按 运行 按钮 (►),并确认 运行 脚本的身份验证。
从这里开始,在编辑 > 当前项目的触发器菜单项之后,您将在 G Suite 开发人员中心打开一个新页面。点击右下角的+添加触发器按钮,设置触发器设置如下:
- 选择要运行的函数:
onChange
- 选择应 运行 的部署:
Head
- Select 事件来源:
From spreadsheet
- Select 事件类型:
On change
然后按保存。
已删除 Sheets:
这是棘手的部分;不幸的是,无法通过使用 onChange()
.
然而,如果这是一个非常重要的事情,我可以推荐的最好的事情是看一下 file revisions of Drive files and the Drive API's file revisions: list
and revisions: get
方法,并在 e.changeType == REMOVE_GRID
上做一些整合,但实际上你应该尽可能多地尝试和备份 sheet,这样如果重要的结构丢失,它可以很容易地恢复。