将Google表格用作网络服务

时间:2019-04-08 10:50:16

标签: google-apps-script google-sheets google-sheets-api

我有一个复杂的工作表,其中包含许多公式和单元格值,它们根据特定单元格中的某些给定值来计算结果。 基本上,我想将此工作表用作功能:基于Web服务的计算器,该计算器接受参数(来自其他Web应用程序)并吐出一些json结果。 现在,最后一部分(返回数据)由Google脚本doGet函数处理,例如ContentService.createTextOutput(JSON.stringify(output))

我想知道的是:我应该如何在表单中输入输入参数?

我希望这个“计算器”一次被多个用户使用(可能),所以我想我无法更新工作表中的单元格以获取计算值,否则我会遇到诸如写冲突等问题?

Google表格中是否存在类似于虚拟单元格的内容?还有其他方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:0)

不建议将公式与脚本结合使用,因为这样做效率低下且容易出错。但是,如果没有其他选择,可以尝试以下方法。

  • LockService用于防止冲突
  • flush()用于防止缓存

摘要:

/**
* Retrieves value in a spreadsheet based on inputs provided
* @param {Number} a1 - A number to input in a1 of sheet1
* @param {Number} b1 - A number to input in b1 of sheet1
* @return {Number} c1 - The value in c1, which was modified by formulas? due to a1 and b1 inputs
*/
function blackBox_(a1,b1) {
  try{
    LockService.getScriptLock().waitLock(2000);//Wait to get lock for 2s(Unreliable?)
    const ss = SpreadsheetApp.getActive();
    ss.getRange("Sheet1!A1:B1").setValues([[a1,b1]]);
    SpreadsheetApp.flush(); //flush the changes
    return ss.getRange("Sheet1!C1").getValue();
  } catch(e) {
    return e;
  }
}

function doGet(e){
  //e=e || {};
  const par = e.parameter || {};
  const a1 = par.a1 || 2;
  const b1 = par.b1 || 2;
  console.log(blackBox_(a1,b1))
}

参考文献: