通过更改满足条件时保护 Sheet (Google Sheet)
Protect Sheet when condition is met by change (Google Sheet)
有一个案例是对某个学生进行了测试。学生只能在给定时间之前使用测试答案。
示例案例如下:
https://docs.google.com/spreadsheets/d/1xS3SMrSh2vHCb-ShP96IzzKQGRXYK7ACKO0Ua4_OHOY/edit?usp=sharing
- Sheet1!A:A 是给出问题的地方
- Sheet1!B:B 是学生必须填写答案的地方
- Sheet2!A1 是保护或取消保护 Sheet1 的条件。当日期在 15 号之后,此单元格变为 1,否则保持为 0。此单元格自动更改,因为它包含 TODAY() 公式。
- 当 Sheet2!A1 变为 1 时,Sheet1!A:B 需要被保护以防止任何人编辑,除非文件的所有者
是否可以在满足条件时自动保护 sheet 或范围(示例中为 Sheet1!A:B)?
例如,如果 Sheet2 中的单元格 A1 为 0,则 Sheet1 将受到保护,不会被任何人(不包括我)编辑。如果Sheet2的A1单元格不为0,则Sheet1不再被锁定
有什么公式或google sheet脚本可以解决这个问题吗?
您实际上可以使用 Apps 脚本的 Time Driven Trigger 在 Sheet 上实现它。时间驱动触发器在特定时间执行。在您的情况下,您必须使用 Month timer 作为 Type of time based trigger。 月计时器 具有 day of month
和 time of day
属性,您可以设置这些属性以确定脚本将 运行.
示例:
按照以下步骤操作:
- 将下面的代码复制并粘贴到您的代码编辑器中并保存。
function testFunc(){
var e = {
'day-of-month':16
}
lockUnlockSheet(e)
}
function lockUnlockSheet(e) {
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
if (e['day-of-month'] >= 16) {
var protection = sheet1.protect().setDescription("Protect Sheet1");
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
} else {
sheet1.protect().remove();
}
}
- 粘贴代码后,单击保存
- 转到编辑器中的触发器 选项卡(位于编辑器的左侧,带有闹钟符号)
- 单击添加触发器
- 复制下面触发器的配置(您应该生成了 2 个触发器)
它应该是这样的:
一切就绪。但是为了测试函数,我们需要另一个函数的帮助来模仿 Trigger 的行为。这是我们使用 testFunc()
.
的地方
在您的编辑器中单击 Debug 按钮旁边的下拉菜单并将其更改为 testFunc 然后单击 运行.
如果将day-of-month
的值设置为16-31,则会锁定Sheet1.
如果您将其更改为 1 - 15,它将解锁。
注意:可安装的触发器始终 运行 在创建者的帐户下。 getEffectiveUser()
永远是你。
更新:使用 onEdit 触发器
代码:
function onEditLock(e) {
var range = e.range;
var sheet = range.getSheet();
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
if (range.getA1Notation() == "A1" && sheet.getName() == "Sheet2") {
if (e.value == 1) {
var protection = sheet1.protect().setDescription("Protect Sheet1");
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
} else if(e.value == 0) {
sheet1.protect().remove();
}
}
}
触发器设置:
输出:
注意:当用户更改电子表格中的值时 onEdit() 仅 运行s。
参考文献:
有一个案例是对某个学生进行了测试。学生只能在给定时间之前使用测试答案。
示例案例如下: https://docs.google.com/spreadsheets/d/1xS3SMrSh2vHCb-ShP96IzzKQGRXYK7ACKO0Ua4_OHOY/edit?usp=sharing
- Sheet1!A:A 是给出问题的地方
- Sheet1!B:B 是学生必须填写答案的地方
- Sheet2!A1 是保护或取消保护 Sheet1 的条件。当日期在 15 号之后,此单元格变为 1,否则保持为 0。此单元格自动更改,因为它包含 TODAY() 公式。
- 当 Sheet2!A1 变为 1 时,Sheet1!A:B 需要被保护以防止任何人编辑,除非文件的所有者
是否可以在满足条件时自动保护 sheet 或范围(示例中为 Sheet1!A:B)?
例如,如果 Sheet2 中的单元格 A1 为 0,则 Sheet1 将受到保护,不会被任何人(不包括我)编辑。如果Sheet2的A1单元格不为0,则Sheet1不再被锁定
有什么公式或google sheet脚本可以解决这个问题吗?
您实际上可以使用 Apps 脚本的 Time Driven Trigger 在 Sheet 上实现它。时间驱动触发器在特定时间执行。在您的情况下,您必须使用 Month timer 作为 Type of time based trigger。 月计时器 具有 day of month
和 time of day
属性,您可以设置这些属性以确定脚本将 运行.
示例:
按照以下步骤操作:
- 将下面的代码复制并粘贴到您的代码编辑器中并保存。
function testFunc(){
var e = {
'day-of-month':16
}
lockUnlockSheet(e)
}
function lockUnlockSheet(e) {
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
if (e['day-of-month'] >= 16) {
var protection = sheet1.protect().setDescription("Protect Sheet1");
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
} else {
sheet1.protect().remove();
}
}
- 粘贴代码后,单击保存
- 转到编辑器中的触发器 选项卡(位于编辑器的左侧,带有闹钟符号)
- 单击添加触发器
- 复制下面触发器的配置(您应该生成了 2 个触发器)
它应该是这样的:
一切就绪。但是为了测试函数,我们需要另一个函数的帮助来模仿 Trigger 的行为。这是我们使用 testFunc()
.
在您的编辑器中单击 Debug 按钮旁边的下拉菜单并将其更改为 testFunc 然后单击 运行.
如果将day-of-month
的值设置为16-31,则会锁定Sheet1.
如果您将其更改为 1 - 15,它将解锁。
注意:可安装的触发器始终 运行 在创建者的帐户下。 getEffectiveUser()
永远是你。
更新:使用 onEdit 触发器
代码:
function onEditLock(e) {
var range = e.range;
var sheet = range.getSheet();
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
if (range.getA1Notation() == "A1" && sheet.getName() == "Sheet2") {
if (e.value == 1) {
var protection = sheet1.protect().setDescription("Protect Sheet1");
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
} else if(e.value == 0) {
sheet1.protect().remove();
}
}
}
触发器设置:
输出:
注意:当用户更改电子表格中的值时 onEdit() 仅 运行s。