0
votes

Comment mettre à jour toutes les colonnes d'une ligne à la fois à l'aide de la feuille de calcul sur le script Google Apps?

J'ai lu d'autres questions similaires, mais je ne pouvais pas comprendre comment le faire sur mon code.

J'ai une feuille de calcul qui sera remplie d'une application, j'utilise Appendrow pour ajouter des lignes mais j'ai besoin maintenant de Pour mettre à jour la ligne entière avec une nouvelle gamme de données, si la variable PID (Código) de la rangée que je reçois existe sur la feuille de calcul, je dois le mettre à jour, pas ajouter une nouvelle ligne.

 mon tableur xxx


0 commentaires

3 Réponses :


1
votes
  • Lorsque PID code> est inclus dans les valeurs de la colonne "A", vous souhaitez remplacer la ligne avec Rowdata ​​code>. Li>.
  • Lorsque PID code> n'est pas inclus dans les valeurs de la colonne "A", vous souhaitez appendez une nouvelle ligne avec Rowdata ​​code>. Li>.

    Si ma compréhension est correcte, que diriez-vous de cette réponse? S'il vous plaît pensez à cela comme une des réponses possibles possibles. P>

    Script modifié: h3>

    Lorsque votre script est modifié, cela devient comme suit. P>

    function doGet(request) {
      var sheet = SpreadsheetApp.openById("DOCUMENT_ID");
      var range = sheet.getActiveSheet().getDataRange();  // Added
      var data = range.getValues();  // Modified
      var updateIndex = 0;  // Modified
      try{
        var pid = request.parameter.pid;
        var nome = request.parameter.nome;
        var desc = request.parameter.desc;
        var marca = request.parameter.marca;
        var tipo = request.parameter.tipo;
        var preco = request.parameter.preco;
        var ativado = request.parameter.ativado;
        var rowData = [pid, nome, desc, marca, tipo, preco, ativado];
        for(var i = 1; i < data.length; i++){
          if(data[i][0] == pid){
            data[i] = rowData;  // Added
            updateIndex = i;
          }
        }
        if (updateIndex != 0) {  // Added
          range.setValues(data);
        } else {
          sheet.appendRow(rowData);
        }
      } catch(e){
        console.log(e);
      }
      // In your script, "result" is not declared. Please be careful this.
      return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType);
    }
    

6 commentaires

Non, lorsque l'utilisateur modifie les données à partir de certaines données d'un produit sur mon application, l'application enverra les données (Rowdata) sur Google Spreedsheet, puis le script recevra les données, vérifiez si une ligne a le "PID" (produit ID), et au lieu d'ajouter une nouvelle ligne avec le Rowdata, je dois mettre à jour la même ligne si PID existe sur la feuille de calcul. Si vous pouviez modifier votre réponse, ce sera génial :)


À propos du résultat, j'ai oublié d'ajouter, mais sur le code d'origine, il est là.


@djalmafreestyler Merci de répondre. Je m'excuse profondément pour ma mauvaise compétence en anglais. Au début, je voudrais confirmer si ma compréhension de votre objectif est correcte. De votre réponse, vous souhaitez écraser la ligne existante lorsque pid est inclus dans la colonne "A" de la feuille de calcul. D'autre part, lorsque pid n'est pas inclus dans la colonne "A", vous ne souhaitez pas ajouter rowdata . Est-ce que ma compréhension est correcte?


Merci beaucoup pour répondre, je m'excuse pour mon anglais. Ok je vais essayer d'expliquer chaque étape. Je pense que je devrai expliquer où les données proviendront de vous faire comprendre mon code compliqué hehe, d'ok, d'abord, l'utilisateur ajoutera des produits de registre à l'application, chaque produit sera ajouté dans une rangée (avec ces colonnes, PID, Nome, etc.), Deuxièmement, les données seront reçues et ajouteront à la feuille de calcul, par exemple, nous avons PID = 1, si l'utilisateur ouvre le produit 1 sur l'application et mettez à jour certaines données ...


Lorsque le script reçoit les données (rangées avec ces colonnes), il convient de vérifier si le PID existe sur la feuille de calcul, le cas échéant, mettez à jour la ligne actuelle pid = 1, pas ajouter une nouvelle avec les mêmes valeurs, désolé pour mon mauvais anglais


@djalmafreestyler Merci de répondre. Je dois m'excuser pour ma mauvaise compétence en anglais. De votre réponse, que diriez-vous de supprimer feuille.AppendRow (Rowdata); de mon script modifié? Est-ce le résultat que vous attendez?



1
votes
function doGet(request) {
      var sheet=SpreadsheetApp.openById("DOCUMENT_ID");
      var data=sheet.getActiveSheet().getDataRange().getValues();
      var updateIndex;
      try{
        var pid=request.parameter.pid;
        var nome=request.parameter.nome;
        var desc=request.parameter.desc;
        var marca=request.parameter.marca;
        var tipo=request.parameter.tipo;
        var preco=request.parameter.preco;
        var ativado=request.parameter.ativado;
        var rowData=[pid, nome, desc, marca, tipo, preco, ativado];
          for(var i=1; i < data.length; i++){
            if(data[i][0] == pid){
              updateIndex=i;
              break;
            }
          }
         sheet.getRange(updateIndex+1,1,1,rowData.length).setValues([rowData]);
  } catch(e){
    console.log(e);
  }
  return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType);
}
Sheet.getRange(start row,start col,number of rows,number of columns)

5 commentaires

Pourriez-vous s'il vous plaît expliquer ces paramètres à l'intérieur de gettrange ()?


Tout cela explique dans la référence que je viens d'ajouter.


Utilisation de votre code, je reçois cette exception: "Exception: Les paramètres (chaîne, numéro, numéro, numéro) ne correspondent pas à la signature de la méthode pour SpreadsheetApp.spreadsheet.getrange." On dirait que le premier paramètre est une chaîne, c'est étrange.


Même si je passe une chaîne, j'ai la même exception: feuille.getrange (updateIndex.tostring (), 1,1, rowdata.length) .se Tvalues ​​(Rowdata);


J'ai résolu le problème et j'accepterai votre réponse, la chose était que la classe de feuille de calcul a gettrange (chaîne, numéro, numéro, numéro), ce que je cherchais est gettrange de la classe de feuilles (numéro, numéro, numéro, numéro) SO: var ss = tableur au tableurApp.getacteCursheadshshshshiche (). GetacetsHeet (); Cela fonctionne maintenant, merci.



0
votes

Ma solution:

function doGet(request) {

      // Modified
      var sheet=SpreadsheetApp.openById("DOCUMENT_ID").getActiveSheet();          
      var data=sheet.getDataRange().getValues();
      // 

      var updateIndex;
      try{
        var pid=request.parameter.pid;
        var nome=request.parameter.nome;
        var desc=request.parameter.desc;
        var marca=request.parameter.marca;
        var tipo=request.parameter.tipo;
        var preco=request.parameter.preco;
        var ativado=request.parameter.ativado;
        var rowData=[pid, nome, desc, marca, tipo, preco, ativado];
          for(var i=1; i < data.length; i++){
            if(data[i][0] == pid){
              updateIndex=i;
              break;
            }
          }

         // Modifed
         sheet.getRange(updateIndex + 1, 1, 1, rowData.length).setValues( [rowData] );
         //

  } catch(e){
    console.log(e);
  }
  return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType);
}


2 commentaires

Bienvenue au débordement de la pile. Bien que ce code puisse répondre à la question, fournissant un contexte supplémentaire sur la manière et / ou pourquoi il résout le problème améliorerait la valeur à long terme de la réponse.


Même erreur que j'ai eu avec le code de Cooper: "Exception: Les paramètres (chaîne, numéro, numéro, numéro) ne correspondent pas à la signature de la méthode pour SpreadsheetApp.spreadsheet.getrange." Il semble être la méthode Getrange, premier paramètre demande une chaîne ...