google-apps-script - 如何在谷歌应用脚本中使用 Jobs 资源?
问题描述
如何使用Google Apps 脚本中的“作业”资源?
我知道必须启用 YouTube Reporting API,但可以从哪个对象调用它?
我正在尝试访问 YouTube 报告 API。这是正确的称呼方式吗?如果是这样,我的 Apps 脚本无法识别 youtubeReporting,为什么会这样?
youtubeReporting.jobs()
总而言之,我的目标是提取“内容所有者报告”批量/查询,几乎阅读了所有导致该结果的步骤,除了起点,即对象名称。
解决方案
注意:虽然此答案涉及 YouTube 报告 api,但所有 Google api 的流程应该相同,其中未提供高级 Google 服务包装器。
AFAICT,YouTube 报告 API 不能直接用作高级 Google 服务。您或许可以使用作为高级 Google 服务提供的 YouTubeanalytics api。要访问报告 api,您需要通过 HTTP 调用和urlfetch直接连接到该 api。
必读:
解决方案:
- 可以使用 Google 应用程序脚本访问 YouTube 报告 API
UrlFetchApp
- 可以使用提供的 oauth 令牌绕过完整的 OAuth 流程
ScriptApp
- 在 appsscript.json 清单文件中包含范围。
- 切换到标准 GCP 并为此项目启用 YouTube 报告 API。否则将返回 403。
片段:
/**
* @description A wrapper for accessing Google apis from apps script
* @param {string} url Google URL endpoint
* @param {string} method HTTP method
* @param {object} requestBody Requestbody to send
* @param {object} pathParameters Parameters to modify in the url
* @param {object} queryParameters Queryparameters to append to the url
* @return {object} response
*/
function accessGoogleApiHTTP_(
url,
method,
requestBody = {},
pathParameters = {},
queryParameters = {}
) {
const modifiedUrl = Object.entries(pathParameters).reduce(
(acc, [key, value]) => acc.replace(key, value),
url
);
const queryUrl = Object.entries(queryParameters).reduce(
(acc, param) => acc + param.map(e => encodeURIComponent(e)).join('='),
'?'
);
const options = {
method,
contentType: 'application/json',
headers: {
Authorization: `Bearer ${ScriptApp.getOAuthToken()}` /*Need to set explicit scopes*/,
},
muteHttpExceptions: true,
payload: JSON.stringify(requestBody),
};
const res = UrlFetchApp.fetch(
modifiedUrl + queryUrl,
options
).getContentText();
console.log(res);
return JSON.parse(res);
}
/**
* @see https://developers.google.com/youtube/reporting/v1/reference/rest/v1/jobs/create
* @description POST https://youtubereporting.googleapis.com/v1/jobs
*/
function createYtReportingJob() {
const reportTypeId = 'id',
name = 'name';
const jsonRes = accessGoogleApiHTTP_(
'https://youtubereporting.googleapis.com/v1/jobs',
'POST',
{ reportTypeId, name },
undefined,
{ onBehalfOfContentOwner: 'contentOwnerId' }
);
}
清单范围:
"oauthScopes": [
"https://www.googleapis.com/auth/yt-analytics",
"https://www.googleapis.com/auth/script.external_request"
]
推荐阅读
- java - Shift Thread Start / for循环加倍?
- python - 到点源的欧几里德距离
- google-bigquery - BigQuery - 创建计划查询时出错:dq
- python - 如何在标准输入中使用 Python 诅咒?
- angular - 包装 httpClient 是否被认为是一种好习惯?
- reactjs - Mapbox 在使用 react 的 firebase 上不可用
- database - 创建一个数据库来存储部分内的链接列表
- java - 如果不调用官方网站就调用API,获取访问被拒绝
- json - 基于命名空间嵌套和合并 JSON
- php - 如果我们使用图像 php:7.4-fpm,php7.4-fpm.sock 位于哪里?