Google Apps脚本有承诺吗?

Hug*_*ura 5 javascript google-sheets promise google-apps-script

我有一个表单,供用户输入数据,并使用onFormSubmit触发一个脚本,该脚本根据插入的数据创建CSV,并在创建CSV文件后删除数据。问题是我在创建CSV文件之前删除了数据。通常,我只是打个电话,但我认为使用Google Apps脚本是不可能的。有其他选择吗?

所以我的完整代码在这里:

关于它的作用的更多见解:当我收到新的表单条目时,“ Avaliacao”工作表将更新并触发testTrigger()。

然后,它将在LastUser城市中写入电子邮件和用户名,以便它可以查找一些用于构建CSV文件的数据。但是,在工作表完成其VLOOKUP调用之前,将调用saveAsCsv函数。因此我的CSV文件为空。

同步存在的另一个问题是,如果启用该sLastUser.clear();行,它也会在创建CSV之前删除。

function testTrigger () {
  //open the sheets
  var SS = SpreadsheetApp.getActiveSpreadsheet();
  var sAvaliacao = SS.getSheetByName("Avaliação");  
  var sPreCSV = SS.getSheetByName("PreCSV");  
  var sInput = SS.getSheetByName("Input");    
  var sLastUser = SS.getSheetByName("LastUser"); 
  var dAvaliacao = sAvaliacao.getDataRange().getValues();
  var dInput = sInput.getDataRange().getValues();

  var avaliacaoLastRow = sAvaliacao.getLastRow()-1;

  var userEmail = dAvaliacao[avaliacaoLastRow][2];
  var userCity = dAvaliacao[avaliacaoLastRow][5];
  var userId = dInput[3][52];

  sLastUser.appendRow([userEmail, userCity]);

  saveAsCSV(userId);
//  sLastUser.clear();   <== this is the line where I can`t enable
}

function saveAsCSV(csvName) {
  // Name
  var fileName = String(csvName) + ".csv"
  // Calls convertcsv
  var csvFile = convertOutputToCsv_(fileName);
  // create the file on my drive
  DriveApp.createFile(fileName, csvFile);
}

function convertOutputToCsv_(csvFileName) {
  // open sheets
  var sPreCSV = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PreCSV");
  var cont = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Input").getDataRange().getValues()[3][50] + 1;

  var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PreCSV").getRange(1, 1, cont, 3);
  try {
    var data = ws.getValues();
    var csvFile = undefined;

    // Loop through the data in the range and build a string with the CSV data
    if (data.length > 1) {
      var csv = "";
      for (var row = 0; row < data.length; row++) {
        for (var col = 0; col < data[row].length; col++) {
          if (data[row][col].toString().indexOf(",") != -1) {
            data[row][col] = "\"" + data[row][col] + "\"";
          }
        }

        // Join each row's columns
        // Add a carriage return to end of each row, except for the last one
        if (row < data.length-1) {
          csv += data[row].join(",") + "\r\n";
        }
        else {
          csv += data[row];
        }
      }
      csvFile = csv;
    }
    return csvFile;
  }
  catch(err) {
    Logger.log(err);
    Browser.msgBox(err);
  }
}
Run Code Online (Sandbox Code Playgroud)

Ava*_*nov 6

现在使用引擎 v8 Promise 是定义对象

  • 在 GAS 中,截至 2021 年 9 月,虽然“Promise”是已定义的对象,但未定义任何关联方法(例如“then()”或“catch()”)。 (4认同)

小智 5

确实,Google Apps脚本使用的JS引擎不支持诺言(Logger.log(Promise);表明它是未定义的)。

为确保电子表格更改在继续进行之前生效,可以使用 SpreadsheetApp.flush()

另一个相关功能是由事件在Form Submit上由触发器传递的事件对象:它将提交的数据传递到脚本,而不必将其从电子表格中删除。