【问题标题】:google.visualization.query - filter spreadsheet data column based on a json.parse parametergoogle.visualization.query - 根据 json.parse 参数过滤电子表格数据列
【发布时间】:2021-05-18 07:46:47
【问题描述】:

我有 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(); 

};

【问题讨论】:

  • 你能提供你的 doGet() 函数吗?
  • 对不起,我想我以错误的方式发布了答案????我已经回答了我自己...
  • 感谢您的功能。我不确定您所说的I can't use informations cointained in app url 是什么意思,您从工作表中提取的信息在哪里?
  • 当用户在第一个应用程序中编译文本框并单击一个按钮时,会打开第二个应用程序,其 url 如下所示:script.google.com/a/macros/polo9.org/s/… 我想使用 url 中显示的电子邮件来过滤电子表格中的数据.
  • 看起来正确,网络应用程序中发生了什么?另外,你有JSON.parse(JSON.stringify(request)) 有什么原因吗?好像你可以直接引用参数:uname = request.parameter.username

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


【解决方案1】:

答案:

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

示例:

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

A B C D E F G
1 Employee Date In Out Type Place Email
2 John G. 21/04/2021 9.00 12.00 holidays Ancona john.g@mymail.org
3 Neil Geiman 22/04/2021 9.00 15.00 work Pesaro neil.geiman@mymail.org
4 Penny Lane 23/04/2021 9.00 15.00 holidays Ancona penny.lane@mymail.org
5 Buddy Holly 24/04/2021 9.00 15.00 work Pesaro buddy.holly@mymail.org
6 Neil Geiman 22/04/2021 8.00 15.00 work Ancona neil.geiman@mymail.org
7 Penny Lane 27/04/2021 12.00 15.00 work Pesaro 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.org 作为 URL 参数将记录以下内容:

[
  ["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 表格。

参考资料:

【讨论】:

  • 抱歉,我无法记录所需的行。我在日志中获得: [ ]。我试图调试我的函数,它显示 - 范围:数组(10734)和行:数组(0)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多