如何检查用户是否正在积极编辑单元格

时间:2019-05-02 16:00:20

标签: google-apps-script google-sheets

我有一个非常简单的脚本,该脚本每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})


}

2 个答案:

答案 0 :(得分:0)

  

有什么办法可以在代码中包含一些内容,以检查是否有任何正在被积极编辑的单元格(因为其中有人而变灰了)?

我认为,可以通过使用读取电子表格DOM的网络浏览器扩展程序来实现此目的,但是由于许多Google应用程序的网页源代码是自动生成的,并且任何内容如有更改,恕不另行通知,

不会十分可靠。 >

一方面,应该使用属性服务或缓存服务将由Web浏览器扩展标识的状态保存在文档/脚本存储中,以便时间驱动的触发器可以读取状态,而另一方面,时间可以驱动的触发器保存一个标志,以警告用户使用相同的服务,以便Web浏览器可以读取它们。

注意:为了使此工作正常进行,Web浏览器应从由时间驱动器触发器运行的功能的同一项目中调用功能。

通过使用Google Apps脚本,您可以使用sheetsheet.toast(...)来显示模型和非侵入式警告,然后使用模式对话框来打断用户。

答案 1 :(得分:0)

由于模态在这种情况下不起作用(基于时间的触发器和其他用户),因此我发现解决方法有些笨拙。我在冻结部分的工作表顶部添加了一行明亮的黄色,并说“按Enter。工作表将重新排序。”多次,因此在整个工作表中可见。然后,我将该行隐藏起来,并在排序之前插入此代码:

sheet.showRows(2)
Utilities.sleep(10000)

因此它显示该行,等待10秒钟,进行排序,然后使用sheet.hideRows(2)重新隐藏该行。优雅,事实并非如此。但是它可以在时间触发器上起作用,并且每个用户都能看到它。如果有更优雅的解决方案,我全都听不见。