如何在 google apps 脚本中使用 Jobs 资源?

How to use Jobs resource in google apps script?

如何在 Google Apps 脚本中使用 'Job' resource

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

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

youtubeReporting.jobs()

总而言之,我的目标是提取 'Content Owner Reports' bulk/query,几乎阅读了导致该步骤的所有步骤,除了最开始的地方,它是一个对象名称。

回答

为了访问 YouTube 报告 API,您必须添加 YouTube 分析 API 并可选择添加 YouTube 数据 API 还有。从这一点开始,您可以像 Apps Script: YouTube Analytics 示例中那样创建报告。

切记:

  • 导入 YouTube 分析等服务时 API 请注意版本。

  • 您可以指定所需的指标数量。

参考

Apps Script: YouTube Analytics

YouTube Data API: Channel list

Analytics and Reporting APIs: Content Owner Reports

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

AFAICT,YouTube 报告 API 不能作为高级 Google 服务直接使用。您可以使用 YouTubeanalytics api, which is provided as a advanced Google service. To access reporting api, You need to directly connect to the api through HTTP calls and .

必读:

解决方案:

  • 可以使用 UrlFetchApp
  • 从 Google 应用脚本访问 YouTube 报告 api
  • 可以使用 ScriptApp
  • 提供的 oauth 令牌绕过完整的 OAuth 流程
  • 在 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"
]