首页 > 解决方案 > 如何使用谷歌应用脚​​本修改每个 API 请求的 JSON 数组中的值

问题描述

我正在使用 toggl 报告Toggl API,我注意到每个请求返回的字段的最大值是 50,在文档中说,如果你想获得更多,你可以增加per_pageJSON 数组中的值,我试过了,当我执行 logger.log 时,它似乎可以工作,但实际上返回的值不会超过最初的 50

Toggl 报告 API 文档

https://github.com/toggl/toggl_api_docs/blob/master/reports/detailed.md

这就是我提出请求的方式

var baseURL = 'https://www.toggl.com';
  var userToken = '40532ca98780267d0b87da9d1d983k2f'; //Insert API token here
  var string = userToken +':api_token'
  var headers = {'Authorization':'Basic ' + Utilities.base64Encode(string)}
  var options = {'headers': headers};
  var response = UrlFetchApp.fetch(baseURL + '/api/v8/me', options);

  if (response.getResponseCode() != 200) {
    Logger.log('API request failed');
  }

  var res = JSON.parse(response);
  var email = 'jose@gmail.com';
  var workspaces = res['data']['workspaces'];
  var workspaceId = 322923;

  var params = '?user_agent=' + email + '&workspace_id=' + workspaceId.toString()
  var projectURL = baseURL + '/api/v8/workspaces/' + workspaceId.toString() + '/projects' + params;
  var projectsFetch = UrlFetchApp.fetch(projectURL, options);
  var projects = JSON.parse(projectsFetch.getContentText());

  var datenow = new Date() 
  var firtsday = new Date(datenow.getFullYear(),datenow.getMonth(), 1)
  var lastday = new Date(datenow.getFullYear(),datenow.getMonth()+1, 0)
  var startDate = Utilities.formatDate(firtsday, 'MT', 'yyyy-MM-dd');
  var endDate = Utilities.formatDate(lastday, 'MT', 'yyyy-MM-dd');

  var params = '?user_agent=' + email + '&workspace_id=' + workspaceId.toString() + '&since=' + startDate + '&until=' + endDate;

  var reportURL = baseURL + '/reports/api/v2/details' + params;
  var reportFetch = UrlFetchApp.fetch(reportURL, options);
  var togglReport = JSON.parse(reportFetch.getContentText());
  Logger.log(togglReport['per_page']);

togglReport['per_page'] 是我第二次请求时必须增加的 JSON 数组中的值,我试图增加它togglReport['per_page'] = 50;

* 这是一张看起来像 JSON 数组的图片*

https://www.screencast.com/t/eaFAihNJBCZa

标签: google-apps-script

解决方案


这是不可能的。togglReport是收到的响应。修改togglReport['per_page']不会改变已经收到的响应。

文档说

要获取下一批时间条目,您需要使用相同的参数和递增的页面参数执行新请求。不可能通过一个请求获得所有时间条目。

如果total_count大于(即50),需要通过添加查询参数per_page多次调用api 。page要获取第二页,请使用?page=2and?page=3获取第三页,依此类推


推荐阅读