Google apps script Google应用程序脚本:调用的函数在主函数完成之前执行

Google apps script Google应用程序脚本:调用的函数在主函数完成之前执行,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我注意到,从主函数内部调用的辅助函数试图在主函数完成之前执行 为了便于理解,我将绘制所需的流程图 如图所示,脚本正在尝试执行步骤3,但由于某些原因,它还没有完成将信息发送到第二张工作表的工作,因此被压碎 步骤1的代码: function GrabarVenta(){ var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var spsheet_destino = SpreadsheetApp.openById("1WudWsw

我注意到,从主函数内部调用的辅助函数试图在主函数完成之前执行

为了便于理解,我将绘制所需的流程图

如图所示,脚本正在尝试执行步骤3,但由于某些原因,它还没有完成将信息发送到第二张工作表的工作,因此被压碎

步骤1的代码:

function GrabarVenta(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spsheet_destino = SpreadsheetApp.openById("1WudWswy8xWF02jahGILZxEGWcBK4kKcN1xz6cWCNrzs");

  var origen = spreadsheet.getSheetByName("BackEndVentaCxC"); //Origin of information
  var soporte = spreadsheet.getSheetByName("BackEndPAX"); //support sheet for some variables..

  var ventas_destino = spsheet_destino.getSheetByName("Tb_Venta"); //Destination Sheet

  //Va a la hoja de Ventas de Central
  var fila_destino = soporte.getRange("Q3").getValue(); //We grab where we are going to put the data (row)

  var valores_venta_1 = origen.getRange("B3:Q3").getValues(); //We grab the values we wanna send, part 1
  var valores_venta_2 = origen.getRange("R3").getValue(); //We grab the values we wanna send, part 2

  ventas_destino.getRange(fila_destino, 2, 1, 16).setValues(valores_venta_1); //We set the values part 1
  ventas_destino.getRange(fila_destino, 23, 1, 1).setValue(valores_venta_2); //We set the values part 2

  //Other setting for another function, not important
  var fila_destino_facturacion = soporte.getRange("U1").getValue(); 
  var destino_fact_row = (fila_destino_facturacion - 1) * 15 + 3;  
  ventas_destino.getRange(fila_destino, 21).setValue(destino_fact_row); 

  //We finished setting the data in Sheet 2
  //Now we call the second function that will have as input the data we sent to Sheet 2
  GrabarMargen(); 
}
GrabarMargen()是一个函数,它的功能类似于GrabarVenta()。它还将信息发送到第二个电子表格(但发送到另一个工作表)。我不认为这是问题的一部分,但代码如下:

function GrabarMargen(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spsheet_destino = SpreadsheetApp.openById("1WudWswy8xWF02jahGILZxEGWcBK4kKcN1xz6cWCNrzs");

  var origen = spreadsheet.getSheetByName("BackEndVentaCxC");
  var soporte = spreadsheet.getSheetByName("BackEndPAX");  
  var margen_destino = spsheet_destino.getSheetByName("Tb_Margen");

  var fila_destino = soporte.getRange("Q6").getValue();

  var margen_valores = origen.getRange("B16:AC16").getValues(); //Grabs values
  margen_destino.getRange(fila_destino, 2, 1, 28).setValues(margen_valores); //Set valuesto Sheet 2

  //Calls next Function
  PrepararEnviar(); //HERE IS THE PROBLEM
  LimpiarNuevaVenta();
  IrEnviar();
}
完成后,它将调用PrepareAnViar,它将使用第二个电子表格中的数据

function PrepararEnviar(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var origen = spreadsheet.getSheetByName("Pasajeros");  
  var apoyo = spreadsheet.getSheetByName("BE_Enviar");  
  var destino = spreadsheet.getSheetByName("Enviar");    


  //The data called from SpreadSheet2 is set in C5:C9
  //We check that the data is there
  var validar_valores = apoyo.getRange("C5:C9").getValues();
  for(var i = 0; i < validar_valores.length; i++){
    while (validar_valores[i] == "#N/A") {
      Logger.log(i + "aún es NA");
      Utilities.sleep(200);

    }
  }
  CargarEmail();
}
函数PrepararEnviar(){
var电子表格=SpreadsheetApp.getActiveSpreadsheet();
var origen=spreadsheet.getSheetByName(“Pasajeros”);
var apoyo=spreadsheet.getSheetByName(“BE_Enviar”);
var destino=spreadsheet.getSheetByName(“Enviar”);
//从电子表格2中调用的数据在C5:C9中设置
//我们检查数据是否存在
var validar_valores=apoyo.getRange(“C5:C9”).getValues();
对于(变量i=0;i
执行脚本后,我注意到在执行这些函数之前,数据不会保存到电子表格2中。 但由于没有数据可供使用,此函数将失败

知道为什么会这样吗?
我认为代码将按照编写的顺序执行。我甚至尝试在那里放置一些日志来测试这一点,看起来是这样的,但为什么它不在执行其余部分之前设置SP2中的值呢?

尝试在步骤之间使用SpreadsheetApp.flush()


尝试在步骤之间使用SpreadsheetApp.flush()

这就成功了:)我们每天都学到新东西。谢谢同样,这个答案也有很多关于flush如何工作的细节,这就是诀窍:)每天我们都会学到新的东西。谢谢这个答案也有很多关于flush如何工作的细节~