Imbriquer 2 formules contenant "ImportXML"
complété ci-dessousmais pour le reste, je n'ai pas compris ce que tu souhaitais faire
Merci pour ça déjà !
mais pour le reste, je n'ai pas compris ce que tu souhaitais faire
Pour décortiquer ce qu'il se passe sur ma colonne "I"
( en B4 j'ai toujours le lien direct de l'article https://realt.co/product/1630-e-state-fair-ave-detroit-mi-48203/ )
=INDEX(SPLIT(IMPORTXML(B4,"//@href[contains(.,'wp-json/wp/v2/product')]"),"/",1,1),1,7)Je récupère l'ID du produit grâce a cette formule..
( l'importXML me donne https://realt.co/wp-json/wp/v2/product/281014 et je récupère simplement les chiffres )
et voici la formule complète =
=CONCATENER(B4,"/ref/some1special/?add-to-cart=",(INDEX(SPLIT(IMPORTXML(B4,"//@href[contains(.,'wp-json/wp/v2/product')]"),"/",1,1),1,7)),"&quantity=",H4)Voici le résultat de cette formule :
https://realt.co/product/1630-e-state-fair-ave-detroit-mi-48203//ref/some1special/?add-to-cart=276393&quantity=2
C'est simplement pour me générer un lien d'achat directe. pour pouvoir le faire il me faut :
le site
l'ID du produit
un texte que je rajoute
Une quantité
et la quantité vient de où ?
complété ci-dessousMerci beaucoup !
pour répondre a ta question sur la quantité. c'était un ajout manuel dans une cellule. mais je vais facilement pouvoir adapter.
pour le reste... wahou... je pense pas que j'aurais été capable de faire ça !
Comme a chaque fois, je vais faire une copie et trifouiller dans le script pour comprendre tout ça
C'est possible d'avoir une explication sur cette partie ?
s.match(/class="data">([\s\S\w]+?)</g).forEach(d => {
prov.push(d.split('>')[1].split('<')[0])
})je comprend que c'est pour récupérer les informations présentes entre toutes les balises class="data"> <
mais est-ce que je peux choisir quel groupe prendre ? j'ai essayé de changer les chiffres entres les crochets mais c'est pas bon
par exemple. avoir que le premier
merci :)
d'ailleurs j'ai pû modifier le script car l'ID est visible depuis le marketplace j'avais pas fait attention
si c'est un ajout manuel, change ceci
feuille.getRange('I2').setFormula(`=arrayformula(if(A2:A="",,HYPERLINK(A2:A&"/ref/some1special/?add-to-cart="&H2:H&"&quantity=2","achat")))`)en
={"bla bla";arrayformula(if(I2:I="",,HYPERLINK(A2:A&"/ref/some1special/?add-to-cart="&H2:H&"&quantity="&I2:I,"achat")))}en ajoutant les quantités tu auras le lien
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Market')
.addItem('Update', 'link')
.addToUi();
}
function link() {
var url = 'https://realt.co/fr/place-de-marche/'
var classeur = SpreadsheetApp.getActiveSpreadsheet();
var feuille = classeur.getSheetByName('market');
var fetchedUrl = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
var result = [['titre','titre','titre','titre','titre','titre','titre','titre']]
if (fetchedUrl) {
var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t| )/gm, "")
if (html.length) {
var sections = html.split('type-product')
sections.forEach((s, i) => {
if (i > 0) {
var prov = []
// console.log(s.split('</div></li>')[0])
var url2 = s.split('a href="')[1].split('"')[0]
prov.push(url2)
prov.push(s.split('title">')[1].split('<')[0])
prov.push(s.split('property_status-banner"><span>')[1].split('<')[0])
s.match(/class="data">([\s\S\w]+?)</g).forEach(d => {
prov.push(d.split('>')[1].split('<')[0])
})
div(url2).forEach(d => prov.push(d))
result.push(prov)
}
})
feuille.clearContents()
feuille.getRange(1, 1, result.length, result[0].length).setValues(result)
feuille.getRange('J1').setFormula(`={"bla bla";arrayformula(if(A2:A="",,HYPERLINK(A2:A&"/ref/some1special/?add-to-cart="&H2:H&"&quantity="&H2:H","achat")))}`)
}
}
}
function div(url) {
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 stock = html.split('<span class="property-stock"><strong>')[1].split('</strong>')
}
catch (e) { var stock = '?' }
var id = html.split('https://realt.co/wp-json/wp/v2/product/')[1].split('"')[0]
}
return [stock, id]
}
}C'est possible d'avoir une explication sur cette partie ?
s.match(/class="data">([\s\S\w]+?)</g).forEach(d => { prov.push(d.split('>')[1].split('<')[0]) })
alors ..
s.match(/class="data">([\s\S\w]+?)</g)permet d'avoir un tableau (array) avec tout ce qui se trouve entre class="data"> et <
mais cette formule comprend quand même les > et < qu'il faut enlever
j'ai opté pour un split, mais on aurait pu faire un substring
non les 1 et 0 ne doivent pas être modifiés, le 1 signifie après la valeur incluse dans split et la 0 avant la valeur i,cluse dans plit
permet d'avoir un tableau (array) avec tout ce qui se trouve entre class="data"> et <
ah oui donc obligatoirement ça prendra toutes les classes de cette manière. je peux pas simplement garder le premier groupe.
pour l'ID et le changement de formule c'est exactement ce que j'avais fait
tu peux changer comme suit
var monTableau = s.match(/class="data">([\s\S\w]+?)</g)
var maValeur = monTableau[n].split('>')[1].split('<')[0]
où n sera la valeur que tu veux (0, 1 ou 2 ici)
Bonjour,
Puis-je appliquer une règle Try{ }catch(e){ =' '} sur les prov.push du script ?
cette structure change de ce que j'ai pû voir avant et du coup je ne sais pas comment le placer!
et à cause de ce message d'erreur, je me dit que ça serait bien de mettre ces sécurités sur chaque éléments si les données ne sont pas trouvées comme dans ce cas de figure :
function MARKETPLACE() {
var url = 'https://realt.co/fr/place-de-marche/'
var classeur = SpreadsheetApp.getActiveSpreadsheet();
var feuille = classeur.getSheetByName('REALT');
var feuilleC = feuille.getRange('A2:H18')
var fetchedUrl = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
var result = []
if (fetchedUrl) {
var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t| )/gm, "")
if (html.length) {
var sections = html.split('type-product')
sections.forEach((s, i) => {
if (i > 0) {
var prov = []
// console.log(s.split('</div></li>')[0])
var url2 = s.split('a href="')[1].split('"')[0]
var stock = s.split('value="')[1].split('"')[0]
prov.push(url2)
prov.push(stock)
prov.push(s.split('title">')[1].split('<')[0])
prov.push(s.split('property_status-banner"><span>')[1].split('<')[0])
var tabdata = s.match(/class="data">([\s\S\w]+?)</g)
var yield = tabdata[0].split('>')[1].split('<')[0]
prov.push(yield)
var tabprice = s.match(/class="price-number">([\s\S\w]+?)</g)
var price = tabprice[1].split('>')[1].split('<')[0]
prov.push(price)
div(url2).forEach(d => prov.push(d))
result.push(prov)
}
})
feuilleC.clearContent()
feuille.getRange(2, 1, result.length, result[0].length).setValues(result)
feuille.getRange('H2').setFormula(`=arrayformula(if(A2:A18="",,HYPERLINK(A2:A18&"/ref/some1special/?add-to-cart="&B2:B18&"&quantity="&I2:I18&"","achat")))`)
}
}
}
function div(url) {
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 stock = html.split('<span class="property-stock"><strong>')[1].split('</strong>')
}
catch (e) { var stock = '-' }
}
return [stock]
}
}Merci !
Oui tu peux appliquer
Try{ faire ceci }catch(e){ sinon faire cela }mais les instructions doivent être complètes, ce n'est pas comme le iferror, généralement la seconde se cantonne à sortir le e sur la console, mais en effet dans ton cas tu peux
Try{ resultat.push('ceci') }catch(e){ resultat.push('') }ah ok merci, je ne savais pas si je pouvait le mettre directement sur le resultat.push ! merci
Bonjour,
je me mets un pense-bête vite fait avant que les informations disparaissent
Voici le script que j'utilise : ( certaines fiches me pose des problèmes pour la récupération, voir plus bas )
function MARKETPLACE() {
var url = 'https://realt.co/fr/place-de-marche/'
var classeur = SpreadsheetApp.getActiveSpreadsheet();
var feuille = classeur.getSheetByName('REALT');
var feuilleC = feuille.getRange('A2:H18')
var fetchedUrl = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
var result = []
if (fetchedUrl) {
var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t| )/gm, "")
if (html.length) {
var sections = html.split('type-product')
sections.forEach((s, i) => {
if (i > 0) {
var prov = []
// console.log(s.split('</div></li>')[0])
var url2 = s.split('a href="')[1].split('"')[0]
var stock = s.split('value="')[1].split('"')[0]
prov.push(url2)
prov.push(stock)
prov.push(s.split('title">')[1].split('<')[0])
prov.push(s.split('property_status-banner"><span>')[1].split('<')[0])
var tabdata = s.match(/class="data">([\s\S\w]+?)</g)
var yield = tabdata[0].split('>')[1].split('<')[0]
prov.push(yield)
var tabprice = s.match(/class="price-number">([\s\S\w]+?)</g)
var price = tabprice[1].split('>')[1].split('<')[0]
prov.push(price)
div(url2).forEach(d => prov.push(d))
result.push(prov)
}
})
feuilleC.clearContent()
feuille.getRange(2, 1, result.length, result[0].length).setValues(result)
feuille.getRange('H2').setFormula(`=arrayformula(if(A2:A18="",,HYPERLINK(A2:A18&"/ref/some1special/?add-to-cart="&B2:B18&"&quantity="&I2:I18&"","achat")))`)
}
}
}
function div(url) {
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 stock = html.split('<span class="property-stock"><strong>')[1].split('</strong>')
}
catch (e) { var stock = '-' }
}
return [stock]
}
}Voici le résultat :
Erreur lors du script qui ne récupère pas les infos de ces pages :
<div class="property_status-banner actually_limited_release">
<div class="total-tooltip-container">
<span>Limited Release</span>
<button class="banner-tooltip-container">
<i class="far fa-info-circle"></i>
<div class="tooltip-text-box">
<span>
You have access to this high-demand, re-released property! Get it before it's gone! </span>
<div class="stock-info-container">
<a class="stock-info-item" href="https://realt.co/my-account/orders/" target="_blank" rel="noopener noreferrer">
<span class="stock-info">You Bought </span>
<span class="stock-info stock-info-number">0</span>
</a>
<a class="stock-info-item" href="?add-to-cart=284822&quantity=10">
<span class="stock-info">You Can Buy</span>
<span class="stock-info stock-info-number">10</span>
</a>
</div>
<div class="button-container">
<a href="https://realt.co/product/18980-fenton-st-detroit-mi-48219/" class="limited-release-details-button">
<span>View</span>
</a>
</div>
<i class="fas fa-caret-up"></i>
</div>
</button>
</div>
</div>
<div class="woocommerce-shop-loop left-col"><a href="https://realt.co/product/18980-fenton-st-detroit-mi-48219/" class="woocommerce-LoopProduct-link woocommerce-loop-product__link"> <div class="sold_out-stamp">
<img src="https://cdn-realt.junglewp.net/wp-content/plugins/realt-wp-woocommerce-2.25.6/public/assets/Sold-Out.png" alt="A Sold Out stamp">
</div>
<span class="et_shop_image"><img width="500" height="500" src="https://cdn-realt.junglewp.net/wp-content/uploads/2022/05/18900-Fenton-aerial-6.1-500x500.jpg" class="attachment-woocommerce_thumbnail size-woocommerce_thumbnail" alt="" loading="lazy" /><span class="et_overlay"></span></span></a></div><div class="woocommerce-shop-loop right-col"><h2 class="woocommerce-loop-product__title">18980 Fenton St, Detroit, MI 48219</h2> <div class="marketplace-prices">
<div class="house-price">
<span class="price-title">Total Price</span>
<span class="price-number">$ 1,281,375</span>
</div>
<div class="token-price">
<span class="price-title">Token Price</span>
<span class="price-number">$ 50.25</span>
</div>
</div>
<div class="investorIDlist-wrapper">
<ul class="investorIDlist marketplace">
<li class="assetAnnualReturn">
<h4 class="metaLabel">
Expected Income<button type="button" class="product-tooltip"><i class="fas fa-info-circle"></i><div class="tooltip-wrapper"><strong>Expected Income</strong> is calculated as <strong>Net Rent / Total Investment</strong>. It does not include the potential return to token-holders from capital appreciation on the asset itself.</div></button> </h4>
<span class="data">11.16%</span>
<p class="appreciation-not-included">Not including capital appreciation</p> </li>
<li class="assetRentPerToken">
<h4 class="metaLabel">
Rent per Token<button type="button" class="product-tooltip"><i class="fas fa-info-circle"></i><div class="tooltip-wrapper"><strong>Ever needed to move?</strong> RealT tenants are no different. Sometimes, life happens. RealT manages all maintenance and tenancy responsibilities, so you don’t have to. The cost of property maintenance is paid via the rental income of the property.</div></button> </h4>
<span class="data">$ 5.61 / year</span>
</li>
<li class="assetPropertyType">
<h4 class="metaLabel">
Property Type </h4>
<span class="data">Multi Family</span>
</li>
</ul>
</div>
<div class="marketplaceTokenBtn">
<a href='https://realt.co/product/18980-fenton-st-detroit-mi-48219/' name="add-to-cart" value="284822" class="single_add_to_cart_button button alt realTbtn d-inline-block">
<span class="buttonText">
View Property </span>
</a>
</div>
</div></li>et les versions des pages qui fonctionnent :
<div class="property_status-banner">
<span>
New! </span>
</div>
<div class="woocommerce-shop-loop left-col"><a href="https://realt.co/product/19041-lenore-ave-detroit-mi-48219/" class="woocommerce-LoopProduct-link woocommerce-loop-product__link"><span class="et_shop_image"><img width="500" height="500" src="https://cdn-realt.junglewp.net/wp-content/uploads/2022/05/19041-Lenore-aerial-1-500x500.jpg" class="attachment-woocommerce_thumbnail size-woocommerce_thumbnail" alt="" loading="lazy" /><span class="et_overlay"></span></span></a></div><div class="woocommerce-shop-loop right-col"><h2 class="woocommerce-loop-product__title">19041 Lenore Ave, Detroit, MI 48219</h2> <div class="marketplace-prices">
<div class="house-price">
<span class="price-title">Total Price</span>
<span class="price-number">$ 954,940</span>
</div>
<div class="token-price">
<span class="price-title">Token Price</span>
<span class="price-number">$ 50.26</span>
</div>
</div>
<div class="investorIDlist-wrapper">
<ul class="investorIDlist marketplace">
<li class="assetAnnualReturn">
<h4 class="metaLabel">
Expected Income<button type="button" class="product-tooltip"><i class="fas fa-info-circle"></i><div class="tooltip-wrapper"><strong>Expected Income</strong> is calculated as <strong>Net Rent / Total Investment</strong>. It does not include the potential return to token-holders from capital appreciation on the asset itself.</div></button> </h4>
<span class="data">11.04%</span>
<p class="appreciation-not-included">Not including capital appreciation</p> </li>
<li class="assetRentPerToken">
<h4 class="metaLabel">
Rent per Token<button type="button" class="product-tooltip"><i class="fas fa-info-circle"></i><div class="tooltip-wrapper"><strong>Ever needed to move?</strong> RealT tenants are no different. Sometimes, life happens. RealT manages all maintenance and tenancy responsibilities, so you don’t have to. The cost of property maintenance is paid via the rental income of the property.</div></button> </h4>
<span class="data">$ 5.55 / year</span>
</li>
<li class="assetPropertyType">
<h4 class="metaLabel">
Property Type </h4>
<span class="data">Multi Family</span>
</li>
</ul>
</div>
<div class="marketplaceTokenBtn">
<a href='https://realt.co/product/19041-lenore-ave-detroit-mi-48219/' name="add-to-cart" value="290693" class="single_add_to_cart_button button alt realTbtn d-inline-block">
<span class="buttonText">
View Property </span>
</a>
</div>
</div></li>PS : je ne me suis pas encore posé sur les différences possible pour comprendre l'erreurs. j'ai fais vite car les données sont volatiles ^^"
j'étudierai tout ça plus tard dans la semaine
Bonne journée
Bon,
du coup ce qui est diffèrent est la partie supérieur du code source :
<div class="property_status-banner actually_limited_release">
<div class="total-tooltip-container">
<span>Limited Release</span>
<button class="banner-tooltip-container">
<i class="far fa-info-circle"></i>
<div class="tooltip-text-box">
<span>
You have access to this high-demand, re-released property! Get it before it's gone! </span>
<div class="stock-info-container">
<a class="stock-info-item" href="https://realt.co/my-account/orders/" target="_blank" rel="noopener noreferrer">
<span class="stock-info">You Bought </span>
<span class="stock-info stock-info-number">0</span>
</a>
<a class="stock-info-item" href="?add-to-cart=284822&quantity=10">
<span class="stock-info">You Can Buy</span>
<span class="stock-info stock-info-number">10</span>
</a>
</div>
<div class="button-container">
<a href="https://realt.co/product/18980-fenton-st-detroit-mi-48219/" class="limited-release-details-button">
<span>View</span>
</a>
</div>
<i class="fas fa-caret-up"></i>
</div>
</button>
</div>contre ( pour ceux qui fonctionnent ) :
<div class="property_status-banner">
<span>
New! </span>
</div>En revanche je ne peux plus rien tester pour le moment vu qu'aucunes "Release" sont dispo
je suppose que je doit déjà changer ça :
prov.push(s.split('property_status-banner"><span>')[1].split('<')[0])pour peut-être ça ? :
prov.push(s.split('property_status-[^.]+?"><span>')[1].split('<')[0])est-ce qu'il y aurai d'autres changements à faire ?
merci !
N'hésite pas à tester comme ceci
function myFunction() {
var s = `<div class="property_status-banner actually_limited_release"><div class="total-tooltip-container"><span>Limited Release</span><button class="banner-tooltip-container"><i class="far fa-info-circle"></i>`
console.log(s.split('property_status-[^.]+?"><span>'))
console.log(s.split('property_status-[^.]+?"><span>')[1].split('<')[0])
}mais on verra que cela ne fonctionne pas (par contre j'avoue que le code proposé était très intelligent)
Il faut passer au regex
function myFunction() {
var s = `<div class="property_status-banner actually_limited_release"><div class="total-tooltip-container"><span>Limited Release</span><button class="banner-tooltip-container"><i class="far fa-info-circle"></i>`
console.log(s.match(/(?<=class="property_status-banner.*<span[^<]).*(?=<\/span>)/g)[0])
}Ok ! j'essayerai dès que l'occasion se présentera. et je ferai un retour ici ! merci !