Google脚本-逐个运行一个函数

时间:2018-12-17 23:49:08

标签: google-apps-script google-sheets

我正在尝试编写一个与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时不起作用(具体来说,它似乎忽略了其中的内容超时函数调用)。

我缺少基本知识还是做错了什么?这似乎很奇怪。

1 个答案:

答案 0 :(得分:0)

如果确实是异步的,则应在前者内部使用后者。但是,这不会成为问题。问题是对电子表格所做的更改已被缓存。在进行其他调用之前,应使用SpreadsheetApp.flush()刷新缓存。

摘要:

function saveDateAndResort(event) {
  saveDate(event);
}
function saveDate(event){
  //code to save date here
  SpreadsheetApp.flush();//flush cache 
  reSort();
}