【问题标题】:How do I pass html data form a Google sidebar a variable in gs code如何将 html 数据从 Google 侧边栏传递到 gs 代码中的变量
【发布时间】:2018-08-28 11:06:01
【问题描述】:

我有一张表格,可以根据一组目标跟踪学生的进度 - 学生姓名在顶部,目标在左侧列出。每个学生都在一个组中 - 在下面的示例中,组由 SK、IO 和 NU 表示。

我创建了一个带有各种过滤器的侧边栏。

我遇到的问题是用户将在其中输入组名的过滤器,当单击过滤器按钮时,所有列都将隐藏,除了包含输入组名的列。我有以下代码:

来自 .gs 表:

function showGroup(group) {
  for(var i=2; i<lastCol-36; i++) {
    if(data.getCell(8, i).getValue() != group) { 
    sheet.hideColumns(i);
    }
  }
} 

来自 html 表单:

<form id="filterGroups" >
   <input type="text" value="" id="groupName">
   <input type="button" value="Filter"
     onclick="google.script.run.showGroup(filterGroups)" />

我最接近成功的方法是隐藏所有列,只要表单 id 与传递给 google.script.run 的参数匹配。

【问题讨论】:

  • 为了了解您的情况,您能否提供输入到“过滤器”文本框的示例值和示例电子表格?因为showGroup(group)的脚本依赖于“Filters”中输入的值。
  • 您好 Tanaike,[这里][1] 是工作表。单击左上角的红色过滤器按钮以显示侧边栏。是用户将输入的用户输入字段,在这种情况下,是 SK、NU 或 IO。对应于表格“科学年组”第 8 行中输入的组。当用户单击输入字段旁边的过滤器按钮时,除了包含在输入字段中输入的值的列之外,列会隐藏。希望这是有道理的。 G [1]:docs.google.com/spreadsheets/d/…
  • 感谢您的回复。从您的回复中,我发布了一个答案。你能确认一下吗?
  • 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,请随时告诉我。我想学习解决你的问题。

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


【解决方案1】:
  • 您只想显示具有用户输入值的列。并且您想隐藏除它们之外的其他列。
  • 用户输入的值位于工作表“Science Year Group”的第 8 行。

如果我对你的问题的理解是正确的,那么这次修改怎么样?

修改点:

  • 如果在文本框中输入多个字符串 (SK, NU),if(data.getCell(8, i).getValue() != group){} 始终为 false。
  • 为文本框命名为name="groupName"。使用它,它在 GAS 端使用 group.groupName 检索值。
    • 如果没有给出名称,您可以使用group[""] 检索值。
  • 感觉在for循环中使用sheet.hideColumns(i)时,处理成本高。因此,我针对您的情况使用了 Sheets API。
    • 这样,每列的隐藏和显示可以通过一个 API 调用来控制。
    • 首先,为了使用 Sheets API,请在 Advanced Google Services 和 API 控制台中启用 Sheets API。您可以在 here 了解如何启用 Sheets API。

修改脚本:

气体
function showGroup(group) {
  var unhide = group.groupName.split(",").map(function(e){return e.trim().toUpperCase()});
  var values = sheet.getRange(8, 2, 1, (lastCol - 36) - 2).getValues()[0];
  var template = {updateDimensionProperties:{properties:{},range:{sheetId:sheet.getSheetId(),dimension:"COLUMNS"},fields:"hiddenByUser"}};
  var r = values.map(function(e, i) {
    var t = JSON.parse(JSON.stringify(template));
    if (~unhide.indexOf(e)) {
      t.updateDimensionProperties.properties.hiddenByUser = false;
    } else {
      t.updateDimensionProperties.properties.hiddenByUser = true;
    }
    t.updateDimensionProperties.range.startIndex = i + 1;
    t.updateDimensionProperties.range.endIndex = i + 2;
    return t;
  });
  Sheets.Spreadsheets.batchUpdate({"requests": r}, ss.getId());
}
HTML
<form id="filterGroups" >
  <input type="text" value="" id="groupName" name="groupName">
  <input type="button" value="Filter" onclick="google.script.run.showGroup(filterGroups)">
</form>

注意:

  • 在这个修改后的脚本中,当SK, NU 放在文本框中时,只显示带有SK, NU 的列。其他列被隐藏。

参考:

如果我误解了你的问题,请告诉我。我想修改它。

编辑:

关于您的评论Can you show me how to pass html form data to GAS functions?,我向您展示了一个使用您的 HTML 表单的示例脚本。 HTML表单如下。

HTML

在此示例中,使用google.script.run() 将值发送到showGroup(filterGroups)。

<form id="filterGroups" >
  <input type="text" value="" id="groupName" name="groupName">
  <input type="button" value="Filter" onclick="google.script.run.showGroup(filterGroups)">
</form>
气体

在此示例中,来自 HTML 表单的值由 group.groupName 检索。

function showGroup(group) {
  Logger.log(group.groupName)
}

【讨论】:

  • 不确定我没有做什么,但什么也没发生。由于我是新手,我们可以一次做一件事,这样我就可以了解正在发生的事情。你能告诉我如何将 html 表单数据传递给 GAS 函数吗?一旦我想到了这一点,我就可以考虑使用 API 来提高脚本的效率。
  • @Glenn 对于给您带来的不便,我深表歉意。关于Can you show me how to pass html form data to GAS functions?,我添加了一个示例脚本。那你能确认一下吗?当示例工作时,通过在我的答案中反映脚本,您可以使用表单中的值控制列的隐藏和显示。在运行脚本之前,请在高级 Google 服务和 API 控制台中启用 Sheets API。关于如何启用,请查看我的回答。
  • @Glenn 如果您不了解添加的示例,您可以共享一个示例电子表格,包括具有写入权限的示例脚本吗?我想确认并修改它。我想解决您的问题。
  • 我已经使用 group.groupname 让脚本在没有 API 的情况下工作。将在 API 上再试一次 - 尽管我确实按照提供的说明进行操作,但我认为我没有启用它。很快就会再去更新。感谢您迄今为止的帮助!
  • @Glenn 感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2020-07-26
  • 1970-01-01
  • 2016-12-25
相关资源
最近更新 更多