2 votes

Remplacez la valeur de la cellule dans Google Script Apps

Je suis en train d'essayer d'écrire un script qui, lorsque une cellule dans une feuille de calcul change " ", remplacera la valeur d'une cellule dans une autre feuille par la valeur "". Aidez s'il vous plaît, qu'ai-je fait de mal?

function ChangeTone(event) { 
  if (event.source.getActiveRange().getValue()==" " && event.source.getActiveSheet()==" 100  "){
    var sheet = SpreadsheetApp.getActiveSheet();
    var currRow = sheet.getActiveCell().getRow();
    var value = sheet.getRange(currRow, 1).getDisplayValue();
    var pasteSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("");
    var data = pasteSheet.getDataRange().getValues();
//    if(currRow > 2){
//      sheet.deleteRow(currRow);
//    }
    for(var i = 1; i

3voto

soMario Points 22411

Explication / Problèmes:

Problème:

Il y a un problème évident avec votre code en particulier ici:

event.source.getActiveSheet()==" 100 "

Vous comparez un objet feuille avec une chaîne de caractères et cela renverra toujours false. La manière correcte de le faire serait:

event.source.getActiveSheet().getName()==" 100 "

mais ici j'ai également essayé d'optimiser votre code car il est assez inefficace.

Optimisation:

Vous ne tirez pas pleinement parti de l'objet event.

  • SpreadsheetApp.getActiveSpreadsheet() peut être remplacé par e.source.

Vous définissez également les mêmes variables plusieurs fois alors que vous n'avez besoin de le faire qu'une seule fois:

  • Pour event.source.getActiveSheet() et var sheet = SpreadsheetApp.getActiveSheet(); vous pouvez définir une seule variable pour stocker l'objet de la feuille active et l'appeler chaque fois que vous en avez besoin.

Enfin, je ne suis pas tout à fait sûr de votre logique concernant la boucle for puisque vous ne l'avez pas mentionnée dans votre question.

Mais je vois que vous utilisez une boucle for, une instruction if et une ligne break pour sortir de la boucle for dès qu'il y a une correspondance entre la valeur source et la valeur dans la feuille collée.

  • Au lieu d'utiliser une boucle for, vous pouvez utiliser findIndex pour trouver la valeur qui correspond au critère data[i][1] == value.

  • Aussi, la méthode complète getDataRange() n'est pas nécessaire si vous avez l'intention d'utiliser une seule colonne, c'est pourquoi j'ai modifié cette partie aussi.

Solution:

function onEdit(e){
 const ss = e.source;
 const ar = e.range;
 const activeSheet = ss.getActiveSheet();
 const pasteSheet = ss.getSheetByName("");
  if (ar.getValue()==" " && activeSheet.getName()==" 100  "){
    const value = activeSheet.getRange(ar.getRow(), 1).getValue();
    const data = pasteSheet.getRange('B1:B'+pasteSheet.getLastRow()).getValues().flat();
    const indx = data.findIndex((element) => element == value);
    if (indx>-1){
      const pasteRng = pasteSheet.getRange(indx+1,2);
      pasteRng.clearContent();
      pasteRng.setValue('');   
  }
  }
}

Dites-moi si cela a fonctionné pour vous, sinon j'aimerais le modifier pour que cela le fasse.

0voto

Pavel K Points 23

Merci beaucoup! Le script fonctionne =) J'ai aussi fait un script fonctionnel auparavant. Mais c'est mon premier script, donc il est beaucoup plus lent et pas si ... concis. De plus, il a été déclenché par un déclencheur, et le vôtre fonctionne comme un simple événement. Ma vieille version:

function ChangeTone(event) { 
  if (event.source.getActiveRange().getValue()==" " && event.source.getActiveSheet().getName() == " 100 "){
    var sheet = SpreadsheetApp.getActiveSheet();
    var currRow = sheet.getActiveCell().getRow();
    sheet.getRange("A"+currRow+":F"+currRow).setBackground('#ff5a5a');
    var value = sheet.getRange(currRow, 1).getDisplayValue();
    var pasteSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("");
    var data = pasteSheet.getDataRange().getValues();
    for(var i = 1; i

`

J'ai donc pris votre code et ajouté la suppression de ligne après avoir remplacé la valeur de la cellule. Version finale:

function onEdit(e){
 const ss = e.source;
 const ar = e.range;
 const arRow = ar.getRow();
 const activeSheet = ss.getActiveSheet();
 const pasteSheet = ss.getSheetByName("");
  if (ar.getValue()==" " && activeSheet.getName()==" 100 "){
    const value = activeSheet.getRange(arRow, 1).getValue();
    const data = pasteSheet.getRange('A1:A'+pasteSheet.getLastRow()).getValues().flat();
    const indx = data.findIndex((element) => element == value);
    if (indx>-1){
      const pasteRng = pasteSheet.getRange(indx+1,2);
      pasteRng.clearContent();
      pasteRng.setValue('');
      activeSheet.getRange("C"+arRow+":F"+arRow).deleteCells(SpreadsheetApp.Dimension.ROWS);
  }
  }
}

Merci encore pour votre aide =)

`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X