如何在Google Apps脚本Webapp上为并发用户提供便利?

问题描述 投票:2回答:2

我目前正在创建一个可读写Google表格的网络应用。本质上,它是一个表单应用程序,它从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个人。这是一个问题。例如,如果第二个用户开始使用该应用程序,那么他们的数据将通过添加新行开始覆盖第一个用户的数据,从而“存档”第一个用户的数据。我遇到了以下潜在的解决方案:

  1. 使用LockService来强制一次只有一个人使用该应用程序(这不是理想的选择,因为该应用程序将用于报价客户,并且并不想让用户真正等待)。
  2. 多线程
  3. 堆栈

我不确定2或3如何工作,甚至在GAS中也不可能。如果可以为多个用户提供便利,请问有人可以透露一下吗?

提前感谢

google-apps-script google-sheets concurrency locking
2个回答
1
投票

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

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

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

将UUID写到addProjectInputs()函数中工作表中的一列,然后修改addFurtherInputs()函数以根据UUID找到正确的行(而不是始终获取最后一个),然后将更新写入该行中行。

此方法保证您可以有许多用户在工作,而不必担心彼此覆盖,并且不会因锁定而造成延迟。

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


0
投票

我尝试了所有这些解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.