Javascript / GAS: подсчитать количество вхождений объекта в ответ JSON - PullRequest
1 голос
/ 27 января 2020

Так что моя функция получает записи времени из системы проекта через внешний API. Условием суммирования записей времени является то, что статус подтверждения должен иметь некоторое значение (> 0). Теперь я хочу добавить еще одно условие (&&), чтобы имелся как минимум статус подтверждения каждый день со значением (т. Е. Подсчитывать номер статуса утверждения, равный или превышающий 5 для расчета произойдет). Это заставляет пользователя вводить заявки на каждый день недели. Как я go об этом? Это то, что я пытался, не уверен, как go об этом. PS: рассчитывается для многих пользователей.

var response = UrlFetchApp.fetch(url, options);
var info = JSON.parse(response.getContentText());
var content = info.data;
var total_hours = 0;
var count = 0;



for (var j = 0; j < content.length; j++) {
    if (content[j].approvals.data.length > 0 && count >= 5) {

        total_hours += content[j].hours;

    }
}

Logger.log(total_hours)

}

sample JSON data

{"paging": {"per_page": 20, "page" : 1, "предыдущий": нулевой, "я": "/ API / v1 / пользователей / 678108 / time_entries assignable_id = & поля = утверждения и от = 2020-01-20 & к = 2020-01-24 & user_id = 678108 & стр = 1", "следующая ":" / API / v1 / пользователей / 678108 / time_entries assignable_id = & полей = согласования и из = 2020-01-20 & к = 2020-01-24 & user_id = 678108 & стр = 2 "}," данные? ": [{" ID ": 1661350010, "assignable_id": 2993759, "assignable_type": "идентификатор_пользователя" "Проект": 678108, "bill_rate": 0.1, "bill_rate_id": 37032684, "дата": "2020-01-20", "ч": 0.0, "scheduled_hours": нулевой, "Заметки": нулевой, "задача": нулевой, "is_suggestion": ложь, "created_at": "2020-01-21T17: 32: 22Z", "updated_at": "2020-01-24T15 : 08: 22Z " "утверждения": { "пейджинг": { "я":" ../ time_entries / 1661350010 / сертификаты per_page = 0 & страница = 1" , "следующий?": нулевой, "предыдущий": нулевой,» страница ": 1," per_page ": 0}," данные ": []}},

1 Ответ

2 голосов
/ 27 января 2020

const data = [
  {
    "id": 1661350010,
    "assignable_id": 2993759,
    "assignable_type": "Project",
    "user_id": 678108,
    "bill_rate": 0.1,
    "bill_rate_id": 37032684,
    "date": "2020-01-20",
    "hours": 5,
    "scheduled_hours": null,
    "notes": null,
    "task": null,
    "is_suggestion": false,
    "created_at": "2020-01-21T17:32:22Z",
    "updated_at": "2020-01-24T15:08:22Z",
    "approvals": {
      "paging": {
        "self": "../time_entries/1661350010/approvals?per_page=0&page=1",
        "next": null,
        "previous": null,
        "page": 1,
        "per_page": 0
      },
      "data": [{
        'status': 'approved'
      }, {
        'status': 'approved'
      }, {
        'status': 'approved'
      },{
        'status': 'approved'
      },{
        'status': 'approved'
      },{
        'status': 'approved'
      },{
        'status': 'error'
      }]
    }
  }
];

const total = data.reduce((acc, el) => {
  const {hours, approvals: {data}} = el;
  if (data.length && data.filter(e => e.status === 'approved').length >= 5) {
    acc += hours;
  }
  return acc;
}, 0);

console.log(total);

Чтобы заставить его работать в скрипте приложений и регистрировать результат, вам нужно будет использовать функцию уменьшения следующим образом:

const total = data.reduce(function(acc, el) {
  var hours = el.hours;
  var data = el.approvals.data;

  if (data.length && data.filter(function(element) { return element.status === 'approved'}).length >= 5) {
    acc += hours;
  }
  return acc;
}, 0);

Logger.log(total);
...