簡體   English   中英

Google Apps 腳本是否有承諾?

[英]Are there promises on Google Apps Script?

我有一個用戶輸入數據的表單,我使用 onFormSubmit 觸發一個腳本,該腳本根據插入的數據創建一個 CSV,在我創建 CSV 文件后,我刪除了數據。 問題是我在創建 CSV 文件之前刪除了數據。 通常我只會做一個承諾電話,但我認為 Google Apps Script 是不可能的。 有什么替代方法嗎?

所以我的完整代碼在這里:

更深入地了解它的作用:當我收到一個新的表單條目時,“Avaliacao”表會更新並觸發 testTrigger()。

然后,它將在 LastUser 城市中寫入電子郵件和用戶城市,以便它可以查找一些我將用於構建 CSV 文件的數據。 但是 saveAsCsv 函數在工作表完成其 VLOOKUP 調用之前被調用。 所以我的 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);
  }
}

實際上,Google Apps Script 使用的 JS 引擎不支持承諾( Logger.log(Promise);顯示它是未定義的)。

為了確保電子表格更改在繼續之前生效,您可以使用SpreadsheetApp.flush()

另一個相關的功能是通過 Form Submit 上的觸發器傳遞的事件對象:它將提交的數據傳遞給腳本,而不必將其從電子表格中取出。

現在使用引擎 v8 Promise 是定義對象

GAS 中沒有原生 Promise。 話雖如此,您可以在 ES6/ESnext 中編寫代碼並以這種方式使用 promise。 要了解如何配置模塊暴露在全球范圍內看到我的評論在這里

通過這樣做,您可以利用承諾。 話雖如此,根據您的項目規模,這可能有點矯枉過正。 在這種情況下,我建議盡可能使用簡單的回調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM