【问题标题】:How to accept variable amount of parameters in Google Sheets如何在 Google 表格中接受可变数量的参数
【发布时间】:2021-03-26 01:14:35
【问题描述】:

我正在构建一个解决方案,其中添加到 HTTP 获取请求的参数数量是可变的。这意味着 url 可以携带 1 到 n 个参数。 URL 中的参数用标准名称和附加索引标识。这是一个示例网址:

https://script.google.com/macros/s/xxxxxxx/exec?fileName=2020-12-15&fridgeItems=2&fridgeItem0=ValueOfFridgeItem0&fridgeItem1=ValueOfFridgeItem1

如何解释 .gs 中 doGet() 函数中参数的可变数量?

编辑: 我想用这个请求创建一个新的谷歌表的标题。可变数量的参数应该是列标题。例如。如果请求包含 5 个参数,我想在 google 表格的第一行中将参数的相应值添加到第 1 到第 5 列中。

我尝试了以下代码,但它不起作用:

function doGet(request) {
var FileNameString = request.parameter.fileName; //name of the new .gs file
var FridgeItems = request.parameter.fridgeItems; //amount of parameters/column headers passed to .gs

var sheet = SpreadsheetApp.create(FileNameString);

   for(var i=0; i<FridgeItems ; i++){
   sheet.getRange(1,i+2)
   .setValues(
     sheet.appendRow([request.parameter.fridgeItem&i]);
     );
   }
 }
}

【问题讨论】:

  • 您能否提供所需输出的屏幕截图?我不确定我是否理解这一点。您希望每个键都成为标题,并将相应的值附加到标题下方?是否有具有多个值的键?是否已经设置了标头,或者您想检查标头是否已经存在,如果是这样,只需附加下面的值?您共享的代码有几个问题,但在确定我理解您的目的之前,我不会提出修改建议。
  • @Iamblichus 感谢您的快速回复。我更新了问题以更精确,并根据当前的研究状态修改了源代码。我想要实现的是每个键的值应该代表标题。标题尚未设置,但需要动态设置。由于缺少 appendColumn 函数,才使用 appendRow 函数。由于工作表为空白,appendRow 将添加到第 1 行。

标签: flutter dart google-sheets-api get-request


【解决方案1】:

目标:

当发出GET 请求时,您想要创建一个新的电子表格,其名称将是请求参数键fileName 的值,并且所有其他请求参数中的所有其他值都将附加到仅创建电子表格的工作表。

问题:

  • 您不知道如何循环访问不同的请求参数。
  • 您提供了一个Sheet(这是appendRow(rowContents) 方法返回的内容)作为setValues(values) 的参数。这不是一个有效的论点;您应该提供一个二维数组。

解决办法:

  • 使用delete operatorfileName 中检索值并从对象request.parameter 中删除此属性。
  • 由于您想要其余参数的值,您可以使用Object.values() 检索包含这些值的数组。
  • 使用Spreadsheet.appendRow() 将这些值附加到创建的电子表格中。

代码sn-p:

function doGet(request) {
  const parameters = request.parameter;
  const fileName = parameters.fileName;
  delete parameters.fileName;
  const headers = Object.values(parameters);
  const spreadsheet = SpreadsheetApp.create(fileName);
  spreadsheet.appendRow(headers);
  return ContentService.createTextOutput("Headers appended!");
}

编辑:

如果您想确保标头的设置顺序与查询中的顺序相同,您可以使用 request.queryString 代替,它会返回 URL 的查询字符串部分,因此在这种情况下会是这样的:

fileName=2020-12-15&fridgeItems=2&fridgeItem0=ValueOfFridgeItem0&fridgeItem1=ValueOfFridgeItem1

然后您可以使用mapfilter 的组合来检索值(不包括对应于fileName 的值):

function doGet(request) {
  const headers = request.queryString.split("&")
                                        .map(param => param.split("="))
                                        .filter(param => param[0] !== "fileName")
                                        .map(param => param[1]);
  const fileName = request.parameter.fileName;
  const sheet = SpreadsheetApp.create(fileName)
  sheet.appendRow(headers);
  return ContentService.createTextOutput("Headers appended!");
}

【讨论】:

  • 非常感谢。这一般有效!但是,请求参数的顺序似乎是不稳定的? “标题”已创建,但与提供的参数顺序不同。多次运行按顺序提供不同的结果。有机会影响订单吗?感谢支持!
  • @AndreasKurz 我在答案中添加了一个替代代码,以便保留订单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
相关资源
最近更新 更多