Используйте Google Script для подсчета дат в столбце, равном определенной ячейке - PullRequest
0 голосов
/ 13 ноября 2018

Я использую VBA в течение многих лет, но у меня возникли некоторые трудности при конвертации в google script и javascript.Я пытаюсь создать номер счета-фактуры на основе даты счета-фактуры, принимая во внимание предыдущие записи с той же датой, используя формат YYMMDD ## (например, 3 счета-фактуры 13/13/2018 создадут номера счетов-фактур 18111301, 18111302 и 18111303)в Google Sheets.Я не могу использовать формулу для этой конкретной ситуации.

Я провел последние 3 дня, копаясь в постах и ​​учебных пособиях GS, но безуспешно.Я должен что-то упустить.Я знаю, что это должно быть какое-то быстрое решение для чего-то действительно легкого, но я был бы очень признателен за помощь.

В этой текущей итерации я пытался преобразовать значение поиска и набор данных в формат даты, но япопробовал это без преобразования.Я извиняюсь, если заметки кажутся обильными.Я начинаю составлять карту каждого шага, когда что-то идет не так.

function testbed0() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var dte = ss.getActiveCell().getValue() //invoice date entered by user in column 1
  var cdte = Date(dte); //???convert cell value for comparison to date
  var lrow = ss.getLastRow();
  var r = ss.getRange(1, 1, lrow, 1); //set range to first column, rows 1 to last with data
  var data = Date(r.getValues()); //???convert dataset to date format

  var count = 0; //start counter at 0
  //compare variable with dataset & increase counter for matches
  for (var i = 0; i < data.length ; i++) {
    if (data[i][0] == cdte) {
      count++;
    }
  }
  return (count);

  //parts of invoice number
  var invDy = ("0" + (dte.getDate())).slice(-2);
  var invMo = ("0" + (dte.getMonth() + 1)).slice(-2);
  var invYr = ("0" + (dte.getYear())).slice(-2);
  var invCt = ("0" + count).slice(-2);

  //enter new invoice number in invoice column of active row
  ss.getActiveCell().offset(0, 2).setValue(invYr+invMo+invDy+invCt);
}

1 Ответ

0 голосов
/ 14 ноября 2018

Это не совсем то, что вы просили, но оно выполняет то же самое и, возможно, поможет вам двигаться дальше.Я отформатировал первый столбец, чтобы он был простым текстом.Это вычисляет все номера счетов-фактур сверху вниз данных.

function makeInvoiceNumbers(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var actRow=sh.getActiveCell().getRow();
  for(var i=1;i<vA.length;i++){
    var cnt=0;
    for(var j=1;j<i;j++){//Working from top to bottom creating invoice numbers
      if(vA[i][0]==vA[j][0]){//I assume that the entrees on the top came before the entrees below them.
        cnt++;
      }
    }
    vA[i][1]=getInvoiceString(vA[i][0].toString(),cnt);
  }
  rg.setValues(vA);
}
function getInvoiceString(d,n){
  var dA=d.split('/');
  var yy=dA[2].toString().slice(2);//gets the last two digits of a four digit year
  var mm=padFor2Digits(dA[0]);
  var dd=padFor2Digits(dA[1]);
  var nn=padFor2Digits(String(n));
  return yy+mm+dd+nn;
}
function padFor2Digits(s){
  if(s.length<2){
    s='0' + s;
  }
  return s
}

Данные перед запуском makeInvoiceNumbers ()

enter image description here

Данные после запуска makeInvoiceNumbers ()

enter image description here

Если бы я делал это для себя, я бы, вероятно, использовал триггер onEdit и просто делал это для одной строки ввремя.

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