我有一个共享的电子表格,其中包含许多表格,并带有一个OnOpen脚本,该脚本可隐藏除仪表板以外的所有打开的表格。有一个自定义菜单,用户可以从中显示和处理工作表。
问题在于,当User1在Sheet1上工作时,User2打开电子表格,而OnOpen脚本为 User1和User2都隐藏Sheet1。
是否可以确定其他用户是否当前正在处理电子表格? (以控制OnOpen工作表隐藏操作)。
实现这一目标的另一种方法?
答案 0 :(得分:0)
我认为,确定是否有活动用户最接近的方法是使用一个捕获编辑内容的简单触发器在工作表上不断缓存活动:
var EDIT_CACHESTRING = "last write";
// Bind the simple edit trigger (no authorizations needed)
function onEdit(eventObject) {
CacheService.getDocumentCache()
.put(EDIT_CACHESTRING, (new Date().getTime()).toString());
}
function onOpen(eventObject) {
// or function myNonSimpleTriggerOnOpen(e), if you do stuff that needs authorization.
const cache = CacheService.getDocumentCache();
// If nothing was cached, there have been no recent edits.
// (default cache duration is 10 minutes).
var lastWrite = cache.get(EDIT_CACHESTRING);
var showOnlyDashboard = !lastWrite;
// If something was cached, then determine how long it has been since the edit.
if (lastWrite) {
const now = new Date().getTime();
lastWrite = parseInt(lastWrite, 10);
showOnlyDashboard = (now - lastWrite) > someNumberOfSeconds * 1000;
}
if (showOnlyDashboard) {
methodThatHidesSheets();
}
/**
* other stuff you do in your on open function
*/
}
您可能会觉得更奇特,并缓存一个包含已编辑工作表名称/ id(将从编辑触发器的事件对象获取的对象)以及编辑时间的对象,以允许隐藏非活动工作表,即使其他正在进行编辑。
另一种方法(也更复杂)是在当前文档中使用Drive Activity API。您将在自己选择的时间范围内检查某种活动,然后在该时间范围内缺乏该活动时将呼叫锁定到methodThatHidesSheets()
。
这两种方法均无法确定工作表是否存在非活动的查看器。正如您已经注意到的那样,无法按每个用户控制同一文档中图纸的可见性-文档的任何当前查看者都可以看到与所有其他当前查看者相同的图纸。
必读: