javascript - Google Apps Script:如何使用 Google App Script 从单个 GA 帐户创建用户列表并每月以 CSV 格式邮寄一次
问题描述
下面的代码从谷歌开发者网站上的资源中收集而来,我已经苦苦挣扎了几天。
请注意,我的 JS 技能有限。
基本上我想做的是:
- 从特定 GA 帐户收集用户 - 成功(结果在控制台中可见,通过 localhost)
- 将此列表导入 Google 表格 - 不成功
- 每月以 CSV 格式邮寄此列表一次 - 不成功
以上所有内容均通过 Google Script App 编辑器完成。
所有相关 API 都已打开(管理 API、高级服务),并且已创建必要的客户端 ID 和 API 密钥,并且在所有范围内都处于活动状态。
我在哪里可以找到拖放资源来帮助我完成这项工作而无需修改。
还有一种方法可以不触发 Google 脚本编辑器中的 AUTH 并始终登录吗?当我运行部分代码时,我得到了 mssg“gapi 未定义”。当我通过本地服务器运行它时,它一切正常,但不能在编辑器中运行,并且在 GSE 和本地机器之间来回切换以进行测试非常烦人。
这是代码。
function authenticate() {
return gapi.auth2.getAuthInstance()
.signIn({scope: "https://www.googleapis.com/auth/analytics.manage.users"})
.then(function() { console.log("Sign-in successful"); },
function(err) { console.error("Error signing in", err); });
}
function loadClient() {
gapi.client.setApiKey("MY-API-KEY");
return gapi.client.load("https://content.googleapis.com/discovery/v1/apis/analytics/v3/rest")
.then(function() { console.log("GAPI client loaded for API"); },
function(err) { console.error("Error loading GAPI client for API", err); });
}
gapi.load("client:auth2", function() {
gapi.auth2.init({client_id: "MY ID"});
});
function listAccountUserLinks() {
var request = gapi.client.analytics.management.accountUserLinks.list({
'accountId': 'SPECIFIC ACCOUNT'
});
request.execute(printAccountUserLinks);
}
function printAccountUserLinks(results) {
if (results && !results.error) {
var accountLinks = results.items;
for (var i = 0, accountUserLink; accountUserLink = accountLinks[i]; i++) {
var entity = accountUserLink.entity;
var accountRef = entity.accountRef;
var userRef = accountUserLink.userRef;
var permissions = accountUserLink.permissions;
console.log('User Email: ' + userRef.email);
}
}
}
解决方案
回答:
您不能在 Google Apps 脚本中使用 gapi 客户端。您需要使用内置的 Apps 脚本服务、高级服务,或者直接发出 HTTP 请求并使用UrlFetchApp解析响应。
更多信息:
为了与 Sheets API 交互,您可以使用可在 下激活的 Google Advanced Spreadsheet 服务Services + > Google Sheets API
或内置SpreadsheetApp
类。
Analytics Management API没有高级服务,也没有内置类,因此您需要为此发出 HTTP 请求。
例子:
我建议在与表格交互时使用高级电子表格服务,因为它比SpreadsheetApp
.
首先,要从 Analytics Management API 获取信息,您需要使用正确的身份验证来构建您的请求。根据您对问题的评论:
所有相关 API 都已打开(管理 API、高级服务),并且已创建必要的客户端 ID 和 API 密钥,并且在所有范围内都处于活动状态。
我将假设Google Cloud Console中的正确设置已完成,并且该项目已链接到您的 Apps 脚本项目,因此我将在回答中跳过这些步骤。
首先,您需要使用 HTTP 请求从 Management API 获取有关用户帐户链接的响应:
// Assuming you got the account ID from elsewhere:
function getUserLinks(accountId) {
var url = `https://www.googleapis.com/analytics/v3/management/accounts/${accountId}/entityUserLinks`
var token = ScriptApp.getOAuthToken()
var options = {
"headers": {
'Authorization': 'Bearer ' + token,
},
"method": "GET",
}
return UrlFetchApp.fetch(url, options).getContentText()
}
然后你可以通过传递给你的 print 函数来随意打印:
printAccountUserLinks(getUserLinks("SPECIFIC ACCOUNT"))
要发出 Sheets API 请求,您可以使用高级电子表格服务:
function importToSheet(spreadsheetId, range, results) {
// basic request, change as required:
var request = {
"range": range, // for example "A1:B1"
"values": [
[
"User Email"
],
[
results["items"][0]["entity"]["accountRef"]["userRef"]["email"]
]
],
"majorDimension": "COLUMNS"
}
Sheets.Spreadsheets.Values.append(request, spreadsheetId, range, { "valueInputOption": "USER_ENTERED"
})
}
请在此处查看有关 Sheets API 值更新请求的完整文档。
最后,您可以将电子表格导出为 CSV 文件并将其附加到电子邮件以进行导入。在这里,您可以简单地使用内置GmailApp
类:
// spreadsheetId is the ID of the spreadsheet to convert to CSV
function sendCsv(spreadsheetId) {
var to = "username@domain.com"
var subject = "Converted CSV"
var body = "The converted CSV is attached, please take a look"
GmailApp.sendEmail(to, subject, body, {
attachments: [{
fileName: SpreadsheetApp.openById(spreadsheetId).getName(),
content: convertToCSV(spreadsheetId).getBlob().getBytes(),
mimeType: "text/csv"
}]
})
}
function convertToCSV(spreadsheetId) {
var token = ScriptApp.getOAuthToken()
var options = {
"headers": {
'Authorization': 'Bearer ' + token,
},
"method": "GET",
}
var params = "export?gid=0&format=csv"
var url = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/${params}`
var response = UrlFetchApp.fetch(url, options)
return response
}
不要忘记:
当您使用 GCP 项目时,您必须在清单中为您的脚本设置明确的范围。您将需要的范围是:
...
"oauthScopes": [
"https://www.googleapis.com/auth/analytics.manage.users",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/spreadsheets",
"https://mail.google.com/"
],
...
参考:
推荐阅读
- c# - C# 强制包含可选参数?
- python - 迭代具有相同列标题的 pandas DataFrame
- css - 如何防止 grid-auto-flow 创建新列?
- git - git branch 和 checkout 什么都不做?
- r - ggplot facet_wrap as_labeller 不显示新序列
- ios - UIBarButtonItem 没有响应点击
- sql - Rails:如何获取“join_table.attrbute = x”加入的模型,以及所有其他模型
- python - Pandas read_html 在 Python 中返回具有 NaN 值的列
- c# - 如何使用 PiP 模式管理 Xamarin Forms 上的循环寿命
- modelica - Modelica:如何使用可更换组件?