Répétition de script (éléments inutiles ?)

Bonjour,

j'ai rassembler des scripts pour une utilisation unique. Est-ce que une optimisation est possible ?

j'ai des éléments répétitifs et je ne sais pas si on peux mieux faire (vu que je suis sur quelque chose de basique, c'est surement possible)

Voici l'ensemble :

function myFunctionAll(){

  var url = 'https://realt.co/product/16851-16881-greenfield-rd-detroit-mi-48235/'

  var data = AllHighlights(url)
  var data1 = Allstock(url)
  var data2 = Alltitle(url)
  var data3 = AllFinancials(url)

Logger.log ([data['assetAnnualReturn'],data1,data2,data3['class="fee-item renovation-reserve"']])  
}

function AllHighlights(marketplaceLink) {
  var fetchedUrl = UrlFetchApp.fetch(marketplaceLink, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {
      var json = {}
      var section = html.match(/(<h3 class="blue-title">Property Highlights<\/h3>(.*)<!-- End of Investor ID -->)/g)[0]
      var sousSections = section.match(/<li class[\s\S\w]+?<\/li>/g)
      sousSections.forEach(function(elem){
        var classe = elem.match(/class="([^"]+)"/)[1]
        var donnee = elem.match(/<span class="data">([^<]+)</)[1]
        json[classe] = donnee
      })
      return (json)
    }
  }
}

function AllFinancials(marketplaceLink) {
  var fetchedUrl = UrlFetchApp.fetch(marketplaceLink, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {
      var json = {}
      var section = html.match(/(<div id="property-financials">(.*)<li class="line-item cap-rate line-total no-border-top ">)/g)[0]         
      var sousSections = section.match(/class="fee-item.*?[0-9]+?<\/span>|class="line-item.*?[0-9]+?<\/span>|class="line-total.*?[0-9]+?<\/span>/g)
      sousSections.forEach(function(elem){
        var classe = elem.match(/class="fee-item.([^"]*?)"|class="line-item.([^"]*?)"|class="line-total.([^"]*?)"/g)   
        try{var donnee = elem.match(/<span class="fee-value">([^<]+)<\/span>/)[1];} catch(e){donnee = elem.match(/<span>([^<]+)<\/span>/)[1]}       
        json[classe] = donnee
      })
      return (json)
    }
  }
}

function Allstock(marketplaceLink){
  var fetchedUrl = UrlFetchApp.fetch(marketplaceLink, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {
      var section = html.match('<div><span class="property-stock"><strong>([^<]+)')[1]
    }
   return(section) 
  }
}

function Alltitle(marketplaceLink){
  var fetchedUrl = UrlFetchApp.fetch(marketplaceLink, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {
      var section = html.match('<h1 class="product_title entry-title">([^<]+)')[1]
    }
    return(section) 
  }
}

Hi,

si tu n'utilises pas les fonctions individuellement, tu devrais pouvoir faire ceci

function myFunctionAll() {
  var url = 'https://realt.co/product/16851-16881-greenfield-rd-detroit-mi-48235/'
  var fetchedUrl = UrlFetchApp.fetch(marketplaceLink, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {
      var data = AllHighlights(html)
      var data1 = Allstock(html)
      var data2 = Alltitle(html)
      var data3 = AllFinancials(html)
    }
  }
  Logger.log([data['assetAnnualReturn'], data1, data2, data3['class="fee-item renovation-reserve"']])
}

function AllHighlights(html) {
  var json = {}
  var section = html.match(/(<h3 class="blue-title">Property Highlights<\/h3>(.*)<!-- End of Investor ID -->)/g)[0]
  var sousSections = section.match(/<li class[\s\S\w]+?<\/li>/g)
  sousSections.forEach(function (elem) {
    var classe = elem.match(/class="([^"]+)"/)[1]
    var donnee = elem.match(/<span class="data">([^<]+)</)[1]
    json[classe] = donnee
  })
  return (json)
}

function AllFinancials(html) {
  var json = {}
  var section = html.match(/(<div id="property-financials">(.*)<li class="line-item cap-rate line-total no-border-top ">)/g)[0]
  var sousSections = section.match(/class="fee-item.*?[0-9]+?<\/span>|class="line-item.*?[0-9]+?<\/span>|class="line-total.*?[0-9]+?<\/span>/g)
  sousSections.forEach(function (elem) {
    var classe = elem.match(/class="fee-item.([^"]*?)"|class="line-item.([^"]*?)"|class="line-total.([^"]*?)"/g)
    try { var donnee = elem.match(/<span class="fee-value">([^<]+)<\/span>/)[1]; } catch (e) { donnee = elem.match(/<span>([^<]+)<\/span>/)[1] }
    json[classe] = donnee
  })
  return (json)
}

function Allstock(html) {
  var section = html.match('<div><span class="property-stock"><strong>([^<]+)')[1]
}

function Alltitle(html) {
  var section = html.match('<h1 class="product_title entry-title">([^<]+)')[1]
}

Salut

si tu n'utilises pas les fonctions individuellement, tu devrais pouvoir faire ceci

non ce n'est pas le but. du coup pour une utilisation globale il va falloir que je gère potentiellement le fait de ne pas voir de données, sinon tout le script aura une erreur et ne pourras s'exécuter

L'idée final est de remplacer var url = 'https://realt.co/product/16851-16881-greenfield-rd-detroit-mi-48235/'

par

function lienAPI() {

  var url = "https://api.realt.community/v1/token";
  var response = UrlFetchApp.fetch(url, {
    "method": "GET",
    "headers": {
      "accept": "<*/*>",
      "X-AUTH-REALT-TOKEN": "ma clé API",
      "Content-Type": "application/json"
    }
  });
  var output = [];
  var json = response.getContentText();
  var Data = JSON.parse(json);
  for (let i in Data) {
    var marketplaceLink = Data[i].marketplaceLink
    var fetchedUrl = UrlFetchApp.fetch(marketplaceLink, { muteHttpExceptions: true });
    if (fetchedUrl) {
      Logger.log(marketplaceLink)
    }
  }
}

pour avoir tout les liens d'un coup et faire qu'un seul traitement.

d'ailleurs je ne sais pas ce qui est le plus optimal

-> intégrer le script LienAPI à la place du " var url "
-> lancer le script Lien API à part et travailler a partir de la liste de lien généré sur une plage de ma feuille

je ne sais pas du tout quoi faire et comment faire

je suis largué car tes fonctions ne sont pas les mêmes !!

je suis largué car tes fonctions ne sont pas les mêmes !!


Avec cette fonction j'ai listé tout les liens

function lienAPI() {
  var response = UrlFetchApp.fetch('https://api.realt.community/v1/token',{
    "method": "GET",
    "headers": {
      "accept": "<*/*>",
      "X-AUTH-REALT-TOKEN": "ma clé API",
      "Content-Type": "application/json"
    }
  });
  var json = response.getContentText();
  var Data = JSON.parse(json);
  for (let i in Data) {
    var marketplaceLink = Data[i].marketplaceLink
    var fetchedUrl = UrlFetchApp.fetch(marketplaceLink, { muteHttpExceptions: true });
    if (fetchedUrl) {
      Logger.log(marketplaceLink)
    }
  }
}  

et avec cette fonction je liste tout les éléments que je veux récupérer à partir d'un lien.

function myFunctionAll() {
  var url = 'https://realt.co/product/16851-16881-greenfield-rd-detroit-mi-48235/'
  var fetchedUrl = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {
      var data = AllHighlights(html)
      var data2 = Allstock(html)
      var data1 = Alltitle(html)
      var data3 = AllFinancials(html)
    }
  }
  Logger.log([data1,
              data2,
              data['assetAnnualReturn'],
              data['assetRentStartDate'],    
              data['assetRentPerToken'],
              data['assetTokenPrice'],
              data['assetPropertyType'],
              data['assetNeighborhood'],
              data['assetTotalUnits'],
              data['assetRentalType'],
              data['assetHasTenants'],
              data['assetSection8'],
              data['assetSection8Pays'],
              data3['class="fee-item underlying-asset-price"'],
              data3['class="line-total asset-price no-border-top"'],
              ])
}

function AllHighlights(html) {
  var json = {}
  var section = html.match(/(<h3 class="blue-title">Property Highlights<\/h3>(.*)<!-- End of Investor ID -->)/g)[0]
  var sousSections = section.match(/<li class[\s\S\w]+?<\/li>/g)
  sousSections.forEach(function (elem) {
    var classe = elem.match(/class="([^"]+)"/)[1]
    var donnee = elem.match(/<span class="data">([^<]+)</)[1]
    json[classe] = donnee
  })
  return (json)
}

function AllFinancials(html) {
  var json = {}
  var section = html.match(/(<div id="property-financials">(.*)<li class="line-item cap-rate line-total no-border-top ">)/g)[0]
  var sousSections = section.match(/class="fee-item.*?[0-9]+?<\/span>|class="line-item.*?[0-9]+?<\/span>|class="line-total.*?[0-9]+?<\/span>/g)
  sousSections.forEach(function (elem) {
    var classe = elem.match(/class="fee-item.([^"]*?)"|class="line-item.([^"]*?)"|class="line-total.([^"]*?)"/g)
    try { var donnee = elem.match(/<span class="fee-value">([^<]+)<\/span>/)[1]; } catch (e) { donnee = elem.match(/<span>([^<]+)<\/span>/)[1] }
    json[classe] = donnee
  })
  return (json)
}

function Allstock(html) {
  var section = html.match('<div><span class="property-stock"><strong>([^<]+)')[1]
  return(section)
}

function Alltitle(html) {
  var section = html.match('<h1 class="product_title entry-title">([^<]+)')[1]
  return(section)
}


je voulais juste exploiter tout les liens résultant du script lienAPI pour récupérer les infos en 1x et je cherchais la façon idéal de le faire

En testant comme ça j'ai juste mes liens sur google sheet pas le reste. donc quelque chose ne va pas dans mon appel.

function myFunctionAll1() {

  var url = "https://api.realt.community/v1/token";
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getSheetByName('test');
  var cell = feuille.getRange('A2:E');

  var response = UrlFetchApp.fetch(url, {
    "method": "GET",
    "headers": {
      "accept":"<*/*>",
      "X-AUTH-REALT-TOKEN": "Ma clé",
      "Content-Type": "application/json"
    }
  });

  cell.clearContent();

  var output = [];
  var json = response.getContentText();
  var Data = JSON.parse(json);
  for (let i in Data) {
    var marketplaceLink = Data[i].marketplaceLink
    var fetchedUrl = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
    if (fetchedUrl) {
      var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
      if (html.length) {
        try{var data = AllHighlights1(html)} catch(e){var data = ''}
        try{var data1 = Allstock1(html)} catch(e){var data11 = ''}
        try{var data2 = Alltitle1(html)} catch(e){var data2 = ''}
        try{var data3 = AllFinancials1(html)} catch(e){var data3 = ''}
      }
    }
  output.push([marketplaceLink, data1, data2, data['assetSection8Pays'],data3['class="fee-item underlying-asset-price"']])
}
 if (output.length > 0) {
    feuille.getRange(2, 1, output.length, output[0].length).setValues(output);
  }
}

function AllHighlights1(html) {
  var json = {}
  var section = html.match(/(<h3 class="blue-title">Property Highlights<\/h3>(.*)<!-- End of Investor ID -->)/g)[0]
  var sousSections = section.match(/<li class[\s\S\w]+?<\/li>/g)
  sousSections.forEach(function (elem) {
    var classe = elem.match(/class="([^"]+)"/)[1]
    var donnee = elem.match(/<span class="data">([^<]+)</)[1]
    json[classe] = donnee
  })
  return (json)
}

function AllFinancials1(html) {
  var json = {}
  var section = html.match(/(<div id="property-financials">(.*)<li class="line-item cap-rate line-total no-border-top ">)/g)[0]
  var sousSections = section.match(/class="fee-item.*?[0-9]+?<\/span>|class="line-item.*?[0-9]+?<\/span>|class="line-total.*?[0-9]+?<\/span>/g)
  sousSections.forEach(function (elem) {
    var classe = elem.match(/class="fee-item.([^"]*?)"|class="line-item.([^"]*?)"|class="line-total.([^"]*?)"/g)
    try { var donnee = elem.match(/<span class="fee-value">([^<]+)<\/span>/)[1]; } catch (e) { donnee = elem.match(/<span>([^<]+)<\/span>/)[1] }
    json[classe] = donnee
  })
  return (json)
}

function Allstock1(html) {
  var section = html.match('<div><span class="property-stock"><strong>([^<]+)')[1]
  return(section)
}

function Alltitle1(html) {
  var section = html.match('<h1 class="product_title entry-title">([^<]+)')[1]
  return(section)
}

Je ne sais pas comment ciblé un message précis dans cette discussion.

j'ai mis un réponse sur le post en dessous de ta réponse

je suis largué car tes fonctions ne sont pas les mêmes !!

-- la fonction "myFunctionAll()" fonctionne toute seul et récupère des éléments a partir d'un lien ( "url" )

-- la fonction "lienAPI()" fonctionne toute seul et récupère un ensemble de liens.

== j'aimerai donc appliquer la fonction "myFunctionAll()" à l'ensemble des liens résultant de la fonction "lienAPI()"

je sais pas si je suis clair..

c'est pour ça que je me demandais si c'était mieux de faire un traitement unique. ou en 2x pour faire un tableau de données

je suis désolé mais avec tes fonctions dans tous les sens, je sature, d'autant qu'on était sur une question claire Dimanche à 15:58 à laquelle j'ai répondu

est-ce que cette réponse Dimanche à 16:12 te convenait ?

j'ai l'impression qu'on est parti sur autre chose

est-ce que cette réponse Dimanche à 16:12 te convenait ?

Oui j'ai eu un petite message d'erreur que j'ai réussi a résoudre facilement en corrigeant le script que tu m'as proposé

j'ai l'impression qu'on est parti sur autre chose

J'ai simplement voulu prendre les choses une par une mais si c'est mieux de faire un autre sujet pas de soucis.

si c'est plus lisible et compréhensible pour vous, j'ai pas de problème avec ça.

Rechercher des sujets similaires à "repetition script elements inutiles"