ГАЗ / Javascript дает неправильные цифры при суммировании чисел - PullRequest
0 голосов
/ 25 января 2020

Мой код Javascript / GAS использует идентификатор пользователя для вызова записей времени через API для определенного диапазона дат c (1 неделя) и суммирования часов. Эти записи времени сохраняются в массиве, а затем суммируются. Первые 50 дополнений в журнале верны, но когда вы go просматриваете список, вы получаете неправильные суммы и длинные десятичные разряды. Что может быть не так и что я могу сделать, чтобы решить эту проблему. Вот мой код:

var TKF_URL = 'https://api.10000ft.com/api/v1/';
var TKF_AUTH = 'auth'
var TKF_PGSZ = 2500
var from = '2020-01-06'
var to = '2020-01-22'
var options = {
    method: 'get',
    headers: {
        Authorization: 'Bearer ' + TKF_AUTH
    }
};

function getUsers() {
    var userarray = [];
    var lastpage = false;
    var page = 1;
    do {

        // gets 10kft data   
        var users = read10k_users(page);

        // writes data from current page to array   
        for (var i in users.data) {
            var rec = {};

            // pushing of mandatory data     
            rec.id = users.data[i].id;
            rec.display_name = users.data[i].display_name;
            rec.email = users.data[i].email;
            userarray.push(rec);
        }

        // checks if this is the last page (indicated by paging next page link beeing null   
        if (users.paging.next != null) {
            lastpage = false;
            var page = page + 1;
        } else {
            lastpage = true;
        }
    }
    while (lastpage == false);
    return (userarray);


    return (userarray);

}

function read10k_users(page) {

    var endpoint = 'users?';

    var url = TKF_URL + endpoint + 'per_page=' + TKF_PGSZ + '&auth=' + TKF_AUTH + '&page=' + page;
    var response = UrlFetchApp.fetch(url, options);
    var json = JSON.parse(response);

    //Logger.log(json.data)
    return (json);
}


function showTimeData() {

    var users = getUsers()
    var endpoint = 'users/';
    var time_array = [];



    for (var i = 0; i < users.length; i++) {

        var total_hours = 0;

        // Logger.log(users[i].id)
        var url = 'https://api.10000ft.com/api/v1/users/' + users[i].id + '/time_entries?fields=approvals' + '&from=' + from + '&to=' + to + '&auth=' + TKF_AUTH;
        var response = UrlFetchApp.fetch(url, options);

        var info = JSON.parse(response.getContentText());

        var content = info.data;

        for (var j = 0; j < content.length; j++) {

            total_hours += content[j].hours;

            //     }
            //     
            //       if(total_hours < 35){
            //    
            //          sendMail(user[i]);
            //      
            //       }

            Logger.log('User name: ' + users[i].display_name + ' ' + 'User id: ' + users[i].id + '  ' + 'total hours: ' + total_hours)



        }

    }

    function sendMail(user) {



        var emailAddress = user.email;
        var message = 'Dear ' + user.display_name + 'Your timesheets is incomplete , please visist 10k Ft and commlete your timesheet'
        var subject = 'TimeSheet';

        MailApp.sendEmail(emailAddress, subject, message);

    }
}

Журнал результатов

enter image description here

1 Ответ

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

Вы объявили total_hours за пределами вашего l oop. Поэтому вы рассчитываете общее количество часов для всех работников вместе, а не общее количество часов на одного работника.

(удалено много кода, чтобы показать только важные части для вашей ошибки)

function showTimeData() {
  var users = getUsers()
  var total_hours = 0; // you declare the variable here

  for (var i = 0; i < users.length; i++) {
    var content = info.data;

    // Calculate the sum for current user
    for (var j = 0; j < content.length; j++) {    
      total_hours += content[j].hours;    
    }

    // Check if total_hours for ALL workers is less than 35 
    if (total_hours < 35) sendMail(user[i]);

    // total_hours is not reset, so the sum is used in next iteration.
  }
}

Переместите объявление total_hours внутрь l oop или сбросьте его до нуля.

function showTimeData() {  
  for (var i = 0; i < users.length; i++) {
    var total_hours = 0; // you declare the variable here
  }
}

Ваш l oop должен выглядеть примерно так:

for (var i = 0; i < users.length; i++) {
  var total_hours = 0;

  var url = "https://api.10000ft.com/api/v1/users/" + users[i].id + "/time_entries?fields=approvals" + "&from=" + from + "&to=" + to + "&auth=" + TKF_AUTH;
  var response = UrlFetchApp.fetch(url, options);

  var info = JSON.parse(response.getContentText());

  var content = info.data;

  for (var j = 0; j < content.length; j++) {
    total_hours += content[j].hours;
  }

  if (total_hours < 35) {
    sendMail(user[i]);
  }

  Logger.log("User name: " + users[i].display_name + " " + "User id: " + users[i].id + "  " + "total hours: " + total_hours);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...