我正在尝试编写一个与Google表格相关联的Google脚本,并在编辑时进行一些更改。进行任何更改后,脚本应按特定列对行进行重新排序。在更改特定列时,脚本应在该行的相邻列中创建一个日期值(即,如果您编辑C2,则它应在D2中创建一个与编辑日期匹配的日期)。
每个功能的所有基本功能都可以正常运行,并且它们可以完美地运行。问题是订购/定时。
我编辑C2,因此它在D2中创建了一个日期。但是,显然,在之前这样做,它会对行进行重新排序,以便我编辑的行现在位于新位置,并且日期出现在错误的行中。 (我认为说它对行进行排序而正在处理添加日期的函数可能更准确)。
最终结果是,日期单元格在数字上正确地填充了正确的行(即D2),但是到那时该行2的内容已移动到另一个位置,因此按内容排列在错误的行中。
这是我的功能:
function reSort() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getRange("A2:C1000");
// Sorts descending by column B
range.sort({column: 3, ascending: true });
}
function saveDate (event) {
var ss = event.source;
var range = event.range;
var a1 = range.getA1Notation();
var col = a1[0];
var row = a1.slice(1);
// If status has just been modified
if (col === 'C' && a1.length >= 1) {
var dateCell = ss.getRange('D'.concat(row)).getCell(1,1);
// Empty date if status is null
if (event.value === '') {
dateCell.setValue('');
// Otherwise, add date
} else {
var date = new Date();
dateCell.setValue([date.getMonth() + 1, date.getDate(), date.getFullYear()].join('/'))
}
}
}
function saveDateAndResort(event) {
saveDate(event);
reSort();
}
解决方案似乎是先运行一个功能,然后运行另一个功能(具体来说,先保存日期,然后再求助)。这就是我在saveDateAndResort
中试图执行的操作,这是被触发的功能。但是似乎仍然发生相同的异步行为。我很乐意先运行一个,然后另一个运行,然后尝试另一个,但是当我尝试setTimeout
时不起作用(具体来说,它似乎忽略了其中的内容超时函数调用)。
我缺少基本知识还是做错了什么?这似乎很奇怪。
答案 0 :(得分:0)
如果确实是异步的,则应在前者内部使用后者。但是,这不会成为问题。问题是对电子表格所做的更改已被缓存。在进行其他调用之前,应使用SpreadsheetApp.flush()
刷新缓存。
function saveDateAndResort(event) {
saveDate(event);
}
function saveDate(event){
//code to save date here
SpreadsheetApp.flush();//flush cache
reSort();
}