【发布时间】:2015-02-16 09:25:51
【问题描述】:
用例 - 我与十几个朋友共享了一个 Google 电子表格,我们正在输入我们的匹配预测。关键是在比赛开始前进入它。 使用电子表格,因为每个人都可以看到每个人的预测。
问题 - 是否有允许在特定时间后禁用编辑几个单元格的插件或任何功能?说午夜后 A[7]-M[7] 单元格无法编辑。
【问题讨论】:
标签: google-apps-script google-sheets google-spreadsheet-api
用例 - 我与十几个朋友共享了一个 Google 电子表格,我们正在输入我们的匹配预测。关键是在比赛开始前进入它。 使用电子表格,因为每个人都可以看到每个人的预测。
问题 - 是否有允许在特定时间后禁用编辑几个单元格的插件或任何功能?说午夜后 A[7]-M[7] 单元格无法编辑。
【问题讨论】:
标签: google-apps-script google-sheets google-spreadsheet-api
您可以将脚本设置为在特定时间运行:
在脚本编辑器中,创建一个函数:
function protectRangeAtMidnight() {
//My code will go here
}
在脚本编辑器中,单击“资源”菜单,然后选择“当前项目触发器”。
为特定日期和时间添加触发器。
问题是,代码要做什么?如果您保护范围,但与您共享电子表格的人具有编辑权限,他们可以取消保护范围。如果您将他们的权限更改为仅查看,那么您必须在某个时候将其更改回来以进行下一场比赛。只要有一段时间没有其他人可以编辑工作表,这就会起作用。
您可以从编辑器列表中删除用户:
function protectRangeAtMidnight() {
SpreadsheetApp.openById('The SS ID').removeEditor(emailAddress);
}
您还可以通过DriveApp设置文件共享权限:
【讨论】:
我实际上在做同样的事情,遇到了同样的问题。我想出的解决方案不锁定单元格,而是使用数据验证。网上建议的一些解决方案似乎没有考虑到您需要锁定与日期相关联的一行结果。
这是我用于预测的布局: Google sheet cropped image example
蓝色的单元格然后有以下数据验证(标准是自定义公式,拒绝输入):
=if(isnumber(C1),and(now()<$A1,C1>=0,C1-int(C1)=0))
它检查在 C1 中输入的是一个数字。如果是,它会检查以下内容:
如果是这样,它允许更改单元格。如果比赛已经开始,则无法更改单元格,并且单元格中将出现一个红色三角形(因为将违反数据验证,因为 now() 将在相关日期之后),但它会阻止单元格被更改比赛开始后。
如果您将上述内容与锁定整个工作表(蓝色单元格除外)结合起来,它应该允许用户在启动前做出预测。
如果需要在游戏开始后更改单元格,您可以修改 A 列中的日期,然后在更改日期之前进行更新。
希望这会有所帮助!
【讨论】:
有效的是:
在特定时间锁定单元格或列,然后在另一个时间取消保护:使用每日触发器(甚至手动)
运行函数前需要修改:
工作表名称(在我的示例中为 Sheet1、Sheet2)
要保护的范围(在我的示例中为 A:D)(编辑者将无法编辑指定范围)
function Lock() {
var tabs = ['Sheet1', 'Sheet2'];
var ss = SpreadsheetApp.getActiveSpreadsheet();
for (var i = 0; i < tabs.length; i++) {
var spreadsheet = ss.getSheetByName(tabs[i]);
var protection = spreadsheet.getRange('A:D').protect();
protection.setDescription('Protected')
protection.removeEditors(protection.getEditors());
}
};
要删除保护,您将使用以下脚本:编辑者“恢复”他们编辑指定范围的权限:
function Unlock() {
var ss = SpreadsheetApp.getActive();
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
if (protections[i].getDescription() == 'Protected') {
protections[i].remove();
}
}
};
【讨论】: