У меня есть следующий код для Google Sheet, который использует вызов Utilities.sleep ().
Проблемы, highlightChildren()
и unhighlightChildren()
выполняются после Utilities.sleep()
вызова, и я не могу понять, почему.
function onOpen() {
var ui = SpreadsheetApp.getUi()
ui.createMenu('OKRs').addItem('Show linked Key Results', 'getLinkedKeyResults').addToUi()
}
var highlightChildren = function(rangeList) {
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRangeList(rangeList).setBackground('#ffd966')
}
var unhighlightChildren = function(rangeList) {
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRangeList(rangeList).setBackground('#ffffff')
}
function extendChildrenRefs(stringRefs) {
return stringRefs.replace(/C/gi, 'B') + ',' + stringRefs
}
function getLinkedKeyResults() {
var scriptProperties = PropertiesService.getScriptProperties()
var ss = SpreadsheetApp.getActiveSpreadsheet()
var parentRef = ss.getActiveCell().getA1Notation()
var children = extendChildrenRefs(scriptProperties.getProperty(parentRef)).split(',')
highlightChildren(children)
Utilities.sleep(4 * 1000)
unhighlightChildren(children)
}
/**
* Links a parent key result progress to child key results, storing them in memory. Otheriwse, a direct clone of AVERAGE().
*
* @param {"value1, value2, value3..."} values The child key result values to consider when calculating parent key result progress.
* @return The average of range of value.
* @customfunction
*/
function LINKKEYRESULTS(values) {
if (arguments.length < 2) throw new Error('You must pass at least two key result values!')
var ss = SpreadsheetApp
var scriptProperties = PropertiesService.getScriptProperties()
var formula = ss.getActiveRange().getFormula()
var args = formula.match(/=\w+\((.*)\)/i)
var parentRef = ss.getActiveRange().getA1Notation()
var childrenRefs = args[1]
scriptProperties.setProperty(parentRef, childrenRefs)
var children = childrenRefs.split(',')
var sum = 0
children.forEach( function(child) {
sum += ss.getActiveSheet().getRange(child).getValue()
})
return sum / children.length
}
Следующий GIF показывает ошибочное поведение. Обратите внимание, что я закомментировал вызов метода unhighlightChildren
, чтобы показать ошибочное поведение. Если я оставлю его внутри, вы не увидите подсветку, поскольку через 4 секунды подсветка срабатывает, но сразу за ней следует невыделенная подсветка, из-за чего создается впечатление, что ни один из методов не вызывается (что не соответствует действительности):