Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何检查用户是否正在积极编辑单元格_Google Apps Script_Google Sheets - Fatal编程技术网

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

Google apps script 如何检查用户是否正在积极编辑单元格,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个非常简单的脚本,每15分钟触发一次,根据当天的日期重新按字母顺序排列工作表。除了一个问题外,它工作得很好。在任何给定的时间,大约有8-10个用户使用该表。如果用户在触发功能并重新调用工作表时正在积极输入单元格,则当用户完成输入单元格时,他们编辑了错误的单元格。例如,如果他们开始编辑单元格D24,然后在重新调用该单元格后,该行变为D28,那么当他们按enter键时,他们将覆盖新的D24 有没有办法在代码中加入一些东西来检查是否有任何单元格正在被编辑(因为有人在其中而变灰)?或者其他可以解决

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


}

有没有办法在代码中加入一些东西来检查是否有任何单元格正在被编辑(因为有人在其中而变灰)

我认为这可以通过使用一个可以读取电子表格DOM的web浏览器扩展来实现,但它不会非常可靠,因为许多Google应用程序的网页源都是自动生成的,任何内容都可能在事先没有通知的情况下更改

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

注意:为了实现此功能,web浏览器应该调用时间驱动程序触发器运行的函数的同一项目中的函数


通过使用Google Apps脚本,您可以使用spreadsheet.toast(…)显示模型和非侵入性警告,然后使用模态对话框中断用户。

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

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

因此,它显示该行,等待10秒,排序,然后使用
sheet.hideRows(2)
再次隐藏该行。优雅,它不是。但它在时间触发器上工作,每个用户都能看到它。如果有更优雅的解决方案,我洗耳恭听

当函数运行时,在他们面前抛出一个模态对话框。这使用了基于时间的触发器,因此模式对话框或toast不会运行,因为它是在幕后触发的。如果它是手动运行的,但没有时间触发器,那么它就可以工作。第二,我真的需要它来通知正在使用该工作表的其他用户,当它手动运行时,它只为运行它的用户抛出。其他用户什么也看不到。他们必须自己运行它,这就违背了这一点。我添加了更多的细节:使用属性/缓存服务。顺便说一下,这个问题问的是“任何方式”,而不是漂亮的方式;)