首页 > 解决方案 > google.visualization.query - 根据 json.parse 参数过滤电子表格数据列

问题描述

我有 2 个谷歌网络应用程序。第一个包含 2 个文本框,用户在其中插入用户名和密码。如果被接受,这些信息将传递到第二个应用程序 url。第二个应用程序使用 google.visualization.query 提取来自 google 电子表格的数据。我可以使用 select 和 where 查询,而不会出现字符串或数字等固定值的问题,但我不能使用 app url 中包含的信息。我的目的是根据应用 url 中包含的邮​​件地址查询我的电子表格,这样我就可以只向用户显示他们自己的数据。在我的 html 文件中的脚本下方:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>

google.load('visualization', '1.0', {packages: ['corechart','table']});
google.setOnLoadCallback(loadEditor);


  function loadEditor() {
    var queryString = encodeURIComponent("select A, T where T="");
    var SSID = "xxxxxxxxxMPgJx3gQ" //My spreadsheet ID
    var SHEET_NAME = "FOGLIO ORE"  
    var query = new google.visualization.Query('https://spreadsheets.google.com/tq?key='+SSID+'&sheet='+SHEET_NAME+'&oauth_token=<?=ScriptApp.getOAuthToken()?>&headers=1&tq=' + queryString);
    query.send(handleSampleDataQueryResponse);
  }


  function handleSampleDataQueryResponse(response) {
    console.log(response);
    var data = response.getDataTable();
    var chartTbl = new google.visualization.Table(document.getElementById('dataTable'));
    chartTbl.draw(data);
  }



</script>

这是doGet:

function doGet(request) {

var params = JSON.parse(JSON.stringify(request));
var uname = params.parameter.username;
var email = params.parameter.email;
var imgUrl = params.parameter.imgUrl;
var default_imgUrl = "https://www.pngfind.com/pngs/m/381-3819326_default- 
avatar-svg-png-icon-free-download-avatar.png";
var html = HtmlService.createTemplateFromFile('HTML').evaluate().getContent();
html = html.replace(default_imgUrl, imgUrl);
html = html.replace('<a id="user_name">User Name</a>','<a id="user_name">' + 
uname + '</a>');
html = html.replace('<a id="email">email</a>','<a id="email">' + email + 
'</a>');
return HtmlService.createHtmlOutput(html)
.setTitle('PRESENZE | ' + uname);
output.token = ScriptApp.getOAuthToken(); 

};

标签: javascriptgoogle-apps-scriptgoogle-sheets-api

解决方案


回答:

在将脚本发布为 Web 应用程序后,您需要在函数中打开电子表格SpreadsheetApp().openById()以提取要插入 HTML 表的信息。doGet()

例子:

在这个例子中,我将使用一个电子表格,它看起来像您在评论中链接的表格:

一个 C D F G
1 员工 日期 出去 类型 地方 电子邮件
2 约翰·G。 21/04/2021 9.00 12.00 假期 安科纳 john.g@mymail.org
3 尼尔·盖曼 22/04/2021 9.00 15.00 工作 佩萨罗 neil.geiman@mymail.org
4 便士巷 23/04/2021 9.00 15.00 假期 安科纳 penny.lane@mymail.org
5 巴迪霍利 24/04/2021 9.00 15.00 工作 佩萨罗 buddy.holly@mymail.org
6 尼尔·盖曼 22/04/2021 8.00 15.00 工作 安科纳 neil.geiman@mymail.org
7 便士巷 27/04/2021 12.00 15.00 工作 佩萨罗 penny.lane@mymail.org

doGet()函数中,您将希望使用事件对象来提取 URL 中发送的参数,正如您已经在做的那样:

function doGet(e) {
  const uname = params.parameter.username
  const email = params.parameter.email
  const imgUrl = params.parameter.imgUrl
  // ...
}

然后,您需要以编程方式打开包含数据的电子表格以提取数据:

  // ...
  const ss = SpreadsheetApp.openById("xxxxxxx")
  // ...

您需要将 替换xxxxxxx为电子表格的 ID。

从这里,知道这些列,您可以提取出您需要的信息:

  // ...
  const sheet = ss.getSheetByName("Hours sheet") // use actual sheet name
  const emailColumn = 7 // column G = column 7
  const range = sheet.getDataRange().getValues()
  // ...

然后根据您传递的电子邮件参数过滤您想要的行:

  // ...
  const rows = [] // initialise an array to store the correct rows
  for (let i = 1; i < range.length: i++) { // start from one to skip the header
    if (range[i][emailColumn] == e.parameter.email) {
      rows.push(range[i])
    }
  }

  console.log(rows)
  // ...

因此,您将在此处将所有行记录为 2D 数组,其中包含与参数中的电子邮件对应的电子邮件。对于上面的表格,使用email=penny.lane@mymail.orgURL 参数将记录以下内容:

[
  ["Penny Lane", "23/04/2021", "9.00", "15.00", "holidays", "Ancona", "penny.lane@mymail.org"],
  ["Penny Lane", "27/04/2021", "12.00", "15.00", "work", "Pesaro", "penny.lane@mymail.org"]
]

您可以使用它来形成您的 HTML 表格。

参考:


推荐阅读