javascript - 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();
};
解决方案
回答:
在将脚本发布为 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.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 表格。