google-apps-script - 如何为 Google Apps Script Webapp 上的并发用户提供便利?

标签 google-apps-script google-sheets concurrency locking

我目前正在创建一个可以读取和写入 Google 表格的 web 应用程序。它本质上是一个表单应用程序,它从 HTML 表单中获取输入,然后使用 appendRow() 将其写入工作表中。 (随后使用 getRange()setValue() 将更多数据附加到该行上)。每行代表正在填写的表单的一个实例。请参阅写入过程的示例代码。

/*
Function that is called in Index.html whenever the 'Next' button pressed. This 
gets all inputs from HTML form and stores them in the spreadsheet.

Parameters:
inputArray: a 1x3 array which contains the owner, reference and type of scale.
*/

function addProjectInputs(inputArray) {
  var sheetName = "Inputs";
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName(sheetName);
  Logger.log(sheet);
  var d = new Date();
  var tz = spreadsheet.getSpreadsheetTimeZone();
  var d = [Utilities.formatDate(d,tz,  "dd/MM/yyyy")];
  var data = d.concat(inputArray);
  Logger.log(data);
  sheet.appendRow(data);
}

/* Function to append further data onto the row created from 
addProjectInputs() */

function addFurtherInputs(idlerArray) {
  var sheetName = "Inputs";
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName(sheetName);

  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn()-42;

  var arrayEmpty = idlerArray.every(function(i) { return i === ''; });
  Logger.log(arrayEmpty);

  if (arrayEmpty !== true) {
    for (i = 0; i < idlerArray.length; i++) {
      var range3 = sheet.getRange(lastRow,lastColumn+1+i,1,1);
      range3.setValue(idlerArray[i]);
    }
  }
}

应用程序的摘要页面(第 5 页,出现在所有写入步骤之后)然后读取这些数据(使用 .getRange().getValues()),然后将它们显示在页面上。

当一个用户使用它时,这很好用 - 但是这个应用程序将被多达 20 人使用,可能同时使用。这是一个问题。例如,如果第二个用户开始使用该应用程序,他们的数据将通过添加新行开始覆盖第一个用户的数据,从而“存档”第一个用户的数据。我遇到了以下潜在的解决方案:
  • 利用 LockService 强制一次只有一个人使用该应用程序(不理想,因为该应用程序将用于为客户报价,并且不想让用户等待)。
  • 多线程
  • 堆栈

  • 我不确定 2 或 3 将如何工作,甚至在 GAS 中是否可行。任何人都可以请说明是否可以为多个用户提供便利,以及如何?

    提前致谢

    最佳答案

    我不是锁定,而是通过为每个用户 session 生成一个唯一 ID 来解决这个问题,您可以将其存储在工作表中并用于稍后匹配值。

    在您的入口点 [可能是 doGet(),也可能是 doPost()],生成一个带有 var session_id = Utilities.getUuid(); 的 UUID

    然后将该 session ID 传递给您的模板,并将其包含在所有将来的请求中并返回到 Apps 脚本。

    将 UUID 写入 addProjectInputs() 中工作表中的一列函数,然后修改您的 addFurtherInputs()函数根据 UUID 定位正确的行(而不是总是取最后一个)并将更新写入该行。

    这种方法保证您可以让许多用户工作而不必担心相互覆盖,并且不会因锁定而延迟。

    https://developers.google.com/apps-script/reference/utilities/utilities#getUuid()

    关于google-apps-script - 如何为 Google Apps Script Webapp 上的并发用户提供便利?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59760841/

    相关文章:

    java - 限制对字段的并发访问

    java - 限制最多 N 次并发调用 Java 中的静态方法

    google-apps-script - addLabel(label) 方法出现 "Invalid Argument"错误

    sorting - 谷歌应用脚​​本 : Remove blank rows from range selection for sorting

    regex - 尝试提取单元格中特定值之后的单词

    google-apps-script - 复制文件后获取文档的 URL/ID

    javascript - 通过 Google Sheets Apps 脚本访问 Telegram Bot API 文件

    javascript - Web 应用程序 - Google 表格 - 带有输入字段的 html 表格

    google-sheets - 忽略给定单词的大小写

    java - 我们可以在构造函数上使用 wait() 方法吗? java