JohnnyMelou
JohnnyMelou

Reputation: 31

Google Sheets add a Permanent timestamp

I am setting up a sheet where a person will be able to check a checkbox, in different times, depending on the progress of a task. So, there are 5 checkboxes per row, for a number of different tasks.

Now, the idea is that, when you check one of those checkboxes, a message builds up in the few next cells coming after. So, the message is built in 3 cells. The first cell is just text, the second one is the date, and the third one is time. Also, those cells have 5 paragraphs each (one per checkbox).

The problem comes when I try to make that timestamp stay as it was when it was entered. As it is right now, the time changes every time I update any part of the Google Sheet.

I set u my formulas as follows:

For the text message:

=IF($C4=TRUE,"Insert text 1 here","")&CHAR(10)&IF($E4=TRUE, "Insert text here","")&CHAR(10)&IF($G4=TRUE, "Insert text 3 here","")&CHAR(10)&IF($I4=TRUE, "Insert text 4 here,"")&CHAR(10)&IF($K4=TRUE, "Insert text 5 here","")

For the date:

=IF($C4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")&CHAR(10)&IF($E4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")&CHAR(10)&IF($G4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")&CHAR(10)&IF($I4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")&CHAR(10)&IF($K4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")

And for the time:

=IF($C4=TRUE,(TEXT(NOW(),"HH:mm")),"")&CHAR(10)&IF($E4=TRUE,(TEXT(NOW(),"HH:mm")),"")&CHAR(10)&IF($G4=TRUE,(TEXT(NOW(),"HH:mm")),"")&CHAR(10)&IF($I4=TRUE,(TEXT(NOW(),"HH:mm")),"")&CHAR(10)&IF($K4=TRUE,(TEXT(NOW(),"HH:mm")),"")

And it all looks like this: enter image description here

I would appreciate it greatly if anyone could help me get this to work so that date and time are inserted after checking those boxes and they don´t change again

Upvotes: 0

Views: 496

Answers (1)

Kor
Kor

Reputation: 48

Notice that your struggle with the continuous changing date time. I had the same struggle as yours over the year, and I found a solution that works for my case nicely. But it needs to be a little more "dirty work" with Apps Script

Some background for my case:

  • I have multiple sheets in the spreadsheet to run and generate the timestamp
  • I want to skip my first sheet without running to generate timestamp in it
  • I want every edit, even if each value that I paste from Excel to generate timestamp
  • I want the timestamp to be individual, each row have their own timestamp precise to every second
  • I don't want a total refresh of the entire sheet timestamp when I am editing any other row
  • I have a column that is a MUST FILL value to justify whether the timestamp needs to be generated for that particular row
  • I want to specify my timestamp on a dedicated column only
function timestamp() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const totalSheet = ss.getSheets();

  for (let a=1; a<totalSheet.length; a++) {
    let sheet = ss.getSheets()[a];
    let range = sheet.getDataRange();
    let values = range.getValues(); 

    function autoCount() {
      let rowCount;
      for (let i = 0; i < values.length; i++) {
        rowCount = i
        if (values[i][0] === '') {
          break;
        }
      }
      return rowCount
    }

    rowNum = autoCount()

    for(let j=1; j<rowNum+1; j++){
      if (sheet.getRange(j+1,7).getValue() === '') {
        sheet.getRange(j+1,7).setValue(new Date()).setNumberFormat("yyyy-MM-dd hh:mm:ss");
      }
    }
  }
}

Explanation

  1. First, I made a const totalSheet with getSheets() and run it with a for loop. That is to identify the total number of sheets inside that spreadsheet. Take note, in here, I made let a=1; supposed all JavaScript the same, starts with 0, value 1 is to skip the first sheet and run on the second sheet onwards
  2. then, you will notice a function let sheet = ss.getSheets()[a] inside the loop. Take note, it is not supposed to use const if your value inside the variable is constantly changing, so use let instead will work fine.
  3. then, you will see a function autoCount(). That is to make a for loop to count the number of rows that have values edited in it. The if (values[i][0] === '') is to navigate the script to search through the entire sheet that has value, looking at the row i and the column 0. Here, the 0 is indicating the first column of the sheet, and the i is the row of the sheet. Yes, it works like a json object with panda feeling.
  4. then, you found the number of rows that are edited by running the autoCount(). Give it a rowNum variable to contain the result.
  5. then, pass that rowNum into a new for loop, and use if (sheeet.getRange(j+1,7).getValue() === '') to determine which row has not been edited with timestamp. Take note, where the 7 here indicating the 7th column of the sheet is the place that I want a timestamp.
  6. inside the for loop, is to setValue with date in a specified format of ("yyyy-MM-dd hh:mm:ss"). You are free to edit into any style you like
  7. ohya, do remember to deploy to activate the trigger with event type as On Change. That is not limiting to edit, but for all kinds of changes including paste.

Here's a screenshot on how it would look like:

First Column Value 7th Column Timestamp

Lastly, please take note on some of my backgrounds before deciding to or not to have the solution to work for your case. Cheers, and happy coding~!

Upvotes: 1

Related Questions