我有一个非常简单的脚本,该脚本每15分钟触发一次,以根据当天的日期重新对工作表进行字母顺序化。除了一个问题,它运行完美。在任何给定时间,约有8-10个用户使用该表格。如果在触发功能并重新使用工作表时用户正在主动键入单元格,则当他们完成键入单元格时,他们已经编辑了错误的单元格。例如,如果他们开始编辑单元格D24,然后重新排序后该行将变为D28,则当他们按Enter键时,它们将覆盖新的D24。
有什么方法可以将某些内容合并到代码中,以检查是否有任何正在被积极编辑的单元格(由于内部有人而变灰)?还是可以解决此问题的其他解决方案?
function Alphabetize() {
var spreadsheet = SpreadsheetApp.getActive()
var now = new Date();
var name = Utilities.formatDate(now,"EST","MM-dd")
var day = now.getDay()
var sheet = spreadsheet.getSheetByName(name)
var col = sheet.getLastColumn()
var row = sheet.getLastRow()
var range = sheet.getRange(3, 1, row, col)
range.sort({column: 1, ascending: true})
}
答案 0 :(得分:0)
有什么办法可以在代码中包含一些内容,以检查是否有任何正在被积极编辑的单元格(因为其中有人而变灰了)?
我认为,可以通过使用读取电子表格DOM的网络浏览器扩展程序来实现此目的,但是由于许多Google应用程序的网页源代码是自动生成的,并且任何内容如有更改,恕不另行通知,
不会十分可靠。 >一方面,应该使用属性服务或缓存服务将由Web浏览器扩展标识的状态保存在文档/脚本存储中,以便时间驱动的触发器可以读取状态,而另一方面,时间可以驱动的触发器保存一个标志,以警告用户使用相同的服务,以便Web浏览器可以读取它们。
注意:为了使此工作正常进行,Web浏览器应从由时间驱动器触发器运行的功能的同一项目中调用功能。
通过使用Google Apps脚本,您可以使用sheetsheet.toast(...)来显示模型和非侵入式警告,然后使用模式对话框来打断用户。
答案 1 :(得分:0)
由于模态在这种情况下不起作用(基于时间的触发器和其他用户),因此我发现解决方法有些笨拙。我在冻结部分的工作表顶部添加了一行明亮的黄色,并说“按Enter。工作表将重新排序。”多次,因此在整个工作表中可见。然后,我将该行隐藏起来,并在排序之前插入此代码:
sheet.showRows(2)
Utilities.sleep(10000)
因此它显示该行,等待10秒钟,进行排序,然后使用sheet.hideRows(2)
重新隐藏该行。优雅,事实并非如此。但是它可以在时间触发器上起作用,并且每个用户都能看到它。如果有更优雅的解决方案,我全都听不见。