Суммируйте значения времени, соответствующие той же дате - PullRequest
0 голосов
/ 05 января 2020

В моем листе столбец A - это дата, а столбец B - значения продолжительности времени. Я хочу найти повторяющиеся даты, суммировать соответствующие значения времени повторяющихся дат и показать сумму в последней соответствующей повторной дате. И удалите все остальные повторяющиеся даты. ie если 18/07/2019 повторяется 4 раза, мне нужно суммировать все четыре значения продолжительности и отобразить значение суммы в 4-й повторяющейся позиции и удалить первые три даты 18/07/2019. Я должен сделать это все те даты, которые повторяются. Я написал код, насколько мне известно

function countDate() {
var data = SpreadsheetApp.getActive();
var sheet = data.getSheetByName("Sheet5");
var lastRow = sheet.getLastRow(); 
var sh = sheet.getRange('A1:A'+lastRow);
var cell = sh.getValues();
var data= sheet.getRange('B1:B'+lastRow).getValues();
for (var i =0; i < lastRow; ++i){
var count = 0;
var column2 = cell[i][0];

 for (var j =0; j < i; j++)
   {
   var p=0;
   var column4 = cell[j][0]; 
     if (column4 - column2 === 0  )
       {
    var value1 = data[j][0];
    var value2 = data[i][0];
    var d = value2;
    d.setHours(value1.getHours()+value2.getHours()+0);
    d.setMinutes(value1.getMinutes()+value2.getMinutes());
    sheet.getRange('C'+(i+1)).setValue(d).setNumberFormat("[hh]:mm:ss");
    sheet.deleteRow(j+1-p);
    p++; 
       }  
    }
     }   
    }

Копия листа показана

столбец C - это значения, которые я получаю через Код выше И столбец D - это желаемое значение

После вычисления суммы мне нужно удалить повторяющиеся строки до 15 здесь

1 Ответ

0 голосов
/ 06 января 2020

Ответ:

Это можно сделать, преобразовав B-столбец в формат Plain text и выполнив некоторую обработку данных с помощью словаря JavaScript.

Код:

function sumThemAllUp() {
  var dict = {};
  var lastRow = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getLastRow();
  var dates = SpreadsheetApp.getActiveSpreadsheet().getRange('A1:A' + lastRow).getValues();
  var times = SpreadsheetApp.getActiveSpreadsheet().getRange('B1:B' + lastRow).getValues();

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).setNumberFormat("@");

  for (var i = 0; i < dates.length; i++) {
    if (!dict[dates[i][0]]) {
      dict[dates[i][0]] = times[i][0];
    }
    else {
      var temp = dict[dates[i][0]];
      var hours = parseInt(temp.split(':')[0]);
      var minutes = parseInt(temp.split(':')[1]);
      var additionalHours = parseInt(times[i][0].split(':')[0]);
      var additionalMinutes = parseInt(times[i][0].split(':')[1]);
      var newMinutes = minutes + additionalMinutes;
      var newHours = hours + additionalHours;
      if (newMinutes > 60) {
        newHours = newHours + 1;
        newMinutes = newMinutes - 60;
      }
      dict[dates[i][0]] = newHours + ':' + newMinutes;
    }
  }

  SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange('A1:B' + lastRow).clear();

  var keys = Object.keys(dict);
  for (var i = 0; i < keys.length; i++) {
    SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange('A' + (i + 1)).setValue(keys[i]);
    SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange('B' + (i + 1)).setValue(dict[keys[i]]);
  }
}

Допущения, которые я сделал:

Есть несколько предположений, которые я сделал, когда писал это, вы можете редактировать по мере необходимости, но я решил, что должен сообщить вам:

  • В столбце A указаны только даты, а в столбце B - только время.
  • В столбце B указано время: часы: минуты или минуты: секунды. В любом случае, если значение справа от : достигает 60, оно добавляет единицу к левому значению и сбрасывается.
  • Лист в электронной таблице является первым листом; то, что возвращается Spreadsheet.getSheets()[0].

Я надеюсь, что это полезно для вас!

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...