Use Google Script to count dates in a column equal to a specific cell
I have been using VBA for years, but I have had some extreme difficulty converting to google script and javascript. I am trying to create an invoice number based on invoice date, taking into consideration previous entries with the same date, using the format YYMMDD## (e.g. 3 invoices on 11/13/2018 would create invoice numbers 18111301, 18111302, and 18111303) in Google Sheets. I cannot use a formula for this particular situation.
I have spent the last 3 days digging through posts and GS tutorials without success. I have GOT to be missing something. I know this has to be some quick fix for something seriously easy to do, but I would greatly appreciate some assistance.
In this current iteration, I tried converting the search value and dataset to a Date format, but I have tried it without the conversion. I apologize if the notes seem copious. I start mapping each step when things go wrong.
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);
}
google-apps-script google-sheets count
add a comment |
I have been using VBA for years, but I have had some extreme difficulty converting to google script and javascript. I am trying to create an invoice number based on invoice date, taking into consideration previous entries with the same date, using the format YYMMDD## (e.g. 3 invoices on 11/13/2018 would create invoice numbers 18111301, 18111302, and 18111303) in Google Sheets. I cannot use a formula for this particular situation.
I have spent the last 3 days digging through posts and GS tutorials without success. I have GOT to be missing something. I know this has to be some quick fix for something seriously easy to do, but I would greatly appreciate some assistance.
In this current iteration, I tried converting the search value and dataset to a Date format, but I have tried it without the conversion. I apologize if the notes seem copious. I start mapping each step when things go wrong.
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);
}
google-apps-script google-sheets count
In case anyone is wondering, the output for this gives the correct format, but invCt always reads 00.
– CC_CE
Nov 13 '18 at 20:43
Please add this comment to your post using theedit
link
– Nick
Nov 13 '18 at 21:54
add a comment |
I have been using VBA for years, but I have had some extreme difficulty converting to google script and javascript. I am trying to create an invoice number based on invoice date, taking into consideration previous entries with the same date, using the format YYMMDD## (e.g. 3 invoices on 11/13/2018 would create invoice numbers 18111301, 18111302, and 18111303) in Google Sheets. I cannot use a formula for this particular situation.
I have spent the last 3 days digging through posts and GS tutorials without success. I have GOT to be missing something. I know this has to be some quick fix for something seriously easy to do, but I would greatly appreciate some assistance.
In this current iteration, I tried converting the search value and dataset to a Date format, but I have tried it without the conversion. I apologize if the notes seem copious. I start mapping each step when things go wrong.
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);
}
google-apps-script google-sheets count
I have been using VBA for years, but I have had some extreme difficulty converting to google script and javascript. I am trying to create an invoice number based on invoice date, taking into consideration previous entries with the same date, using the format YYMMDD## (e.g. 3 invoices on 11/13/2018 would create invoice numbers 18111301, 18111302, and 18111303) in Google Sheets. I cannot use a formula for this particular situation.
I have spent the last 3 days digging through posts and GS tutorials without success. I have GOT to be missing something. I know this has to be some quick fix for something seriously easy to do, but I would greatly appreciate some assistance.
In this current iteration, I tried converting the search value and dataset to a Date format, but I have tried it without the conversion. I apologize if the notes seem copious. I start mapping each step when things go wrong.
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);
}
google-apps-script google-sheets count
google-apps-script google-sheets count
asked Nov 13 '18 at 20:40
CC_CECC_CE
1
1
In case anyone is wondering, the output for this gives the correct format, but invCt always reads 00.
– CC_CE
Nov 13 '18 at 20:43
Please add this comment to your post using theedit
link
– Nick
Nov 13 '18 at 21:54
add a comment |
In case anyone is wondering, the output for this gives the correct format, but invCt always reads 00.
– CC_CE
Nov 13 '18 at 20:43
Please add this comment to your post using theedit
link
– Nick
Nov 13 '18 at 21:54
In case anyone is wondering, the output for this gives the correct format, but invCt always reads 00.
– CC_CE
Nov 13 '18 at 20:43
In case anyone is wondering, the output for this gives the correct format, but invCt always reads 00.
– CC_CE
Nov 13 '18 at 20:43
Please add this comment to your post using the
edit
link– Nick
Nov 13 '18 at 21:54
Please add this comment to your post using the
edit
link– Nick
Nov 13 '18 at 21:54
add a comment |
1 Answer
1
active
oldest
votes
This isn't exactly what you asked for but it accomplishes the same thing and perhaps it will help you to move further. I formatted column one to be plain text. This calculates all of the invoice numbers from top to bottom of the data.
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
}
Data before running makeInvoiceNumbers()
Data after running makeInvoiceNumbers()
If I were doing this for myself I would probably use the onEdit trigger and just do it for one line at a time.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53289162%2fuse-google-script-to-count-dates-in-a-column-equal-to-a-specific-cell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
This isn't exactly what you asked for but it accomplishes the same thing and perhaps it will help you to move further. I formatted column one to be plain text. This calculates all of the invoice numbers from top to bottom of the data.
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
}
Data before running makeInvoiceNumbers()
Data after running makeInvoiceNumbers()
If I were doing this for myself I would probably use the onEdit trigger and just do it for one line at a time.
add a comment |
This isn't exactly what you asked for but it accomplishes the same thing and perhaps it will help you to move further. I formatted column one to be plain text. This calculates all of the invoice numbers from top to bottom of the data.
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
}
Data before running makeInvoiceNumbers()
Data after running makeInvoiceNumbers()
If I were doing this for myself I would probably use the onEdit trigger and just do it for one line at a time.
add a comment |
This isn't exactly what you asked for but it accomplishes the same thing and perhaps it will help you to move further. I formatted column one to be plain text. This calculates all of the invoice numbers from top to bottom of the data.
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
}
Data before running makeInvoiceNumbers()
Data after running makeInvoiceNumbers()
If I were doing this for myself I would probably use the onEdit trigger and just do it for one line at a time.
This isn't exactly what you asked for but it accomplishes the same thing and perhaps it will help you to move further. I formatted column one to be plain text. This calculates all of the invoice numbers from top to bottom of the data.
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
}
Data before running makeInvoiceNumbers()
Data after running makeInvoiceNumbers()
If I were doing this for myself I would probably use the onEdit trigger and just do it for one line at a time.
edited Nov 14 '18 at 2:47
answered Nov 14 '18 at 2:39
CooperCooper
6,7112726
6,7112726
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53289162%2fuse-google-script-to-count-dates-in-a-column-equal-to-a-specific-cell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
In case anyone is wondering, the output for this gives the correct format, but invCt always reads 00.
– CC_CE
Nov 13 '18 at 20:43
Please add this comment to your post using the
edit
link– Nick
Nov 13 '18 at 21:54