【问题标题】:Are there promises on Google Apps Script?Google Apps 脚本是否有承诺?
【发布时间】:2016-04-12 00:47:06
【问题描述】:

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

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

更深入地了解它的作用: 当我收到一个新的表单条目时,“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);
  }
}

【问题讨论】:

  • 承诺之前你做了什么?
  • 您需要向我们展示您的代码,以便我们提供帮助。您可能会使用回调来了解某些操作何时完成。我们必须查看您使用的确切代码/API 才能知道是否支持 Promise。仅供参考,关于您的代码的问题几乎总是应该包括您的实际代码。如果我们能看到你的实际代码而不是试图回答一个模糊和假设的问题,你会得到 10 倍更好的答案。
  • @jfriend00,谢谢你的建议。我用代码编辑了我的帖子
  • 我会尝试在 clear 行之前插入 SpreadsheetApp.flush();

标签: javascript google-apps-script google-sheets promise


【解决方案1】:

现在引擎 v8 Promise 被定义为对象

【讨论】:

  • 在 GAS 中,截至 2021 年 9 月,虽然 Promise 是一个已定义的对象,但没有定义任何关联的方法(例如 then()catch())。
【解决方案2】:

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

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

另一个相关功能是表单提交上的触发器传递的event object:它将提交的数据传递给脚本,而无需将其从电子表格中取出。

【讨论】:

    【解决方案3】:

    GAS 中没有原生 Promise。话虽如此,您可以在 ES6/ESnext 中编写代码并以这种方式使用 Promise。要了解如何配置模块以将其公开到全局范围,请参阅我的评论 here

    通过这样做,您可以利用 Promise。话虽如此,根据您的项目规模,这可能是矫枉过正。在这种情况下,我建议尽可能使用简单的回调。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多