首页 > 解决方案 > 如何在谷歌应用脚​​本中使用 Jobs 资源?

问题描述

如何使用Google Apps 脚本中的“作业”资源?

我知道必须启用 YouTube Reporting API,但可以从哪个对象调用它?

我正在尝试访问 YouTube 报告 API。这是正确的称呼方式吗?如果是这样,我的 Apps 脚本无法识别 youtubeReporting,为什么会这样?

youtubeReporting.jobs()

总而言之,我的目标是提取“内容所有者报告”批量/查询,几乎阅读了所有导致该结果的步骤,除了起点,即对象名称。

标签: google-apps-scriptyoutube-apiyoutube-analytics-api

解决方案


注意:虽然此答案涉及 YouTube 报告 api,但所有 Google api 的流程应该相同,其中未提供高级 Google 服务包装器。

AFAICT,YouTube 报告 API 不能直接用作高级 Google 服务。您或许可以使用作为高级 Google 服务提供的 YouTubeanalytics api。要访问报告 api,您需要通过 HTTP 调用和直接连接到该 api

必读:

解决方案:

  • 可以使用 Google 应用程序脚本访问 YouTube 报告 APIUrlFetchApp
  • 可以使用提供的 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"
]

推荐阅读