0

J'essaie d'utiliser ce code que j'ai adapté de http://www.internetgeeks.org/tech/add-timestamp-time-stamp-google-docs-spreadsheet/ à des cellules d'horodatage automatique lors de l'entrée de questions et de réponses pour un fichier Google Sheets. Lorsque je n'utilise que le code pour une colonne, cela fonctionne, mais lorsque je duplique et que je tente de l'utiliser sur deux colonnes, cela ne fonctionne pas.Colonnes multiples d'horodatage automatique dans Google Sheets

Picure of what I want to do.

function onEdit(event) 
{ 
    var timezone = "GMT-4"; 
    var timestamp_format = "MM-dd-yyyy HH:mm:ss"; // Timestamp Format. 
    var updateColName = "Question/Comment"; 
    var timeStampColName = "Date/Time Sent"; 
    var sheet = event.source.getSheetByName('ArtsVision Questions/Comments'); //Name of the sheet where you want to run this script. 

    var actRng = event.source.getActiveRange(); 
    var editColumn = actRng.getColumn(); 
    var index = actRng.getRowIndex(); 
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues(); 
    var dateCol = headers[0].indexOf(timeStampColName); 
    var updateCol = headers[0].indexOf(updateColName); updateCol = updateCol+1; 
    if (dateCol > -1 && index > 1 && editColumn == updateCol) { // only timestamp if 'Last Updated' header exists, but not in the header row itself! 
     var cell = sheet.getRange(index, dateCol + 1); 
     var date = Utilities.formatDate(new Date(), timezone, timestamp_format); 
     cell.setValue(date); 
    } 
} 

function onEdit(event) 
{ 
    var timezone = "GMT-4"; 
    var timestamp_format = "MM-dd-yyyy HH:mm:ss"; // Timestamp Format. 
    var updateColName = "Response"; 
    var timeStampColName = "Date/Time Answered"; 
    var sheet = event.source.getSheetByName('ArtsVision Questions/Comments'); //Name of the sheet where you want to run this script. 

    var actRng = event.source.getActiveRange(); 
    var editColumn = actRng.getColumn(); 
    var index = actRng.getRowIndex(); 
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues(); 
    var dateCol = headers[0].indexOf(timeStampColName); 
    var updateCol = headers[0].indexOf(updateColName); updateCol = updateCol+1; 
    if (dateCol > -1 && index > 1 && editColumn == updateCol) { // only timestamp if 'Last Updated' header exists, but not in the header row itself! 
     var cell = sheet.getRange(index, dateCol + 1); 
     var date = Utilities.formatDate(new Date(), timezone, timestamp_format); 
     cell.setValue(date); 
    } 
} 

Répondre

0

Il ne fonctionne pas de cette façon. Vous ne dupliquez pas la fonction onEdit trigger et attendez qu'il fonctionne tout à coup. Vous devez comprendre les concepts de:

  • indexOf
  • getRow
  • getColumn
  • getRange
  • bloc if condition qui est la partie essentielle du code

Ayant J'ai dit que j'ai modifié votre code et j'espère que vous le réviserez pour que vous puissiez le modifier en fonction de vos besoins:

function onEdit(event) 
{ 
    var timezone = "GMT-5"; 
    var timestamp_format = "MM-dd-yyyy"; // Timestamp Format. 
    var updateColName = "Address"; 
    var timeStampColName = "Date Sent"; 
    var sheet = event.source.getSheetByName('Sheet1'); //Name of the sheet where you want to run this script. 

    var responseArray = ["Response1", "Response2","Response3"]; 
    var questionArray = ["Question1", "Question2", "Question3"]; 

    var actRng = event.source.getActiveRange(); 
    var editColumn = actRng.getColumn(); 
    var index = actRng.getRow(); 
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();//get values and place them inside array 
    var dateCol = headers[0].indexOf(timeStampColName); //get index position inside the array 

for(var i = 0; i < questionArray.length ; i ++){ 
     if (headers[0].indexOf(responseArray[1]) > -1 && index > 1 && editColumn == (headers[0].indexOf(questionArray[i])+1)) { // only timestamp if 'Last Updated' header exists, but not in the header row itself! 

      var cell = sheet.getRange(index, (headers[0].indexOf(responseArray[i])+1)); 
      var date = Utilities.formatDate(new Date(), timezone, timestamp_format); 
      cell.setValue(date); 
     } 
    } 
} 

enter image description here

0

Étant donné que dans ce cas, nous pouvons être assez confiants que la event.range ne contiendra que la dernière cellule modifiée (voir https://developers.google.com/apps-script/guides/triggers/events) cela devrait fonctionner:

function onEdit(event) { 
    var timezone = "GMT-4"; 
    var timestamp_format = "MM-dd-yyyy HH:mm:ss"; // Timestamp Format 
    var date = Utilities.formatDate(new Date(), timezone, timestamp_format); 

    var range = event.range; // this will be the last cell edited 
    var column = range.getColumn(); // use this to check the cell edited was in a relevant column 
    var rangeValue = range.getValue(); // use this to check something was actually entered into the last cell edited 
    var newRange = range.offset(0,1); // this is one cell to the right of the last cell edited 

    if ((column == 2 || column == 4) && rangeValue) { //if the last cell edited was in a relevant column, and there is a value in it 
    newRange.setValue(date); 
    } else if ((column == 2 || column == 4) && !rangeValue) { // there was no question or no response, so make sure there is no timestamp 
    newRange.setValue(""); 
    } 
} 

Si vous protégez les plages de la feuille que vous ne souhaitez pas que les personnes puissent modifier (les en-têtes et les deux colonnes d'horodatage), cela devrait fonctionner correctement.