IMPORTRANGE _ Autorisation d'Accès

Bonjour,

J'ai un fichier Google Sheet (assez lourd) qui fait appel de nombreuses fois à la fonction IMPORTRANGE, afin d'importer des plages de cellules depuis plusieurs autres classeurs (au format Google Sheet également).Jusqu'à présent, l'utilisation de ce fichier ne posait aucun problème, il est même très réactif compte tenu du nombre de données et formules traitées.

Je dois en revanche dorénavant créer des copies de ce fichier. Et là, problème : lors de l'ouverture du fichier copié, il est nécessaire d'autoriser l'association des feuilles.

qdsqsddsd

En cliquant sur autoriser, le classeur tourne en boucle sur "ajout d'autorisations" puis finit par renvoyer une erreur. A mon sens, les données à traiter (d'un coup) sont trop importantes.

sqdqsdsqd

Je comprends que c'est une mesure de sécurité voulue par Google, mais y a t-il un moyen de contourner / supprimer cette règle (tout en conservant ces formules IMPORTRANGE qui, je l'assume, ne sont pas idéales) ?

Je vous remercie d'avance de votre aide !
Bien cordialement,

Bonjour,

Il faut donner les autorisations pour chaque fichier, mais si les formules comportent plusieurs importrange (je ne sais pas si c'est ton cas) cela ne se passe pas bien, il faut les séparer

de toute façon on ne peut pas contourner et c'est tant mieux je pense d'un point de vue sécurité !

l'autre solution serait de passer en script (assez simple) pour importer "brut de forge" les données, à la queue leu leu ou dans des onglets séparés et ensuite y puiser les infos; l'avantage (et l'inconvénient) est de solliciter une seule fois ou à la demande l'importation des données

Bonjour Steelson,

Merci pour ta réponse.
Je n'ai pas de formule comportant plusieurs IMPORTRANGE, mais pour certaines, les plages de données à intégrer sont réellement grandes (plusieurs 1Oaines de milliers de lignes).

Le script n'est pas vraiment dans mes cordes (je crains ne pas disposer de cette compétence), à moins qu'il existe déjà un script "tout fait" que je pourrais reprendre ?

une fonction simple

function importData(){
  // source
  var ss = SpreadsheetApp.openById('ICI L'ID DU FICHIER SOURCE'); 
  var data = ss.getSheetByName('LE NOM DE LA FEUILLE SOURCE').getDataRange().getValues()

  // destination
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('LE NOM DE LA FEUILLE DESTINATAIRE')
  sh.getRange(1,1,data.length,data[0].length).setValues(data)
}

Tout est si simple avec vous Steelson !
Merci beaucoup ! Cela fonctionne parfaitement.

Mes bases de données évoluant sans cesse (de nouvelles données s'intègrent régulièrement). Je présume qu'il me faut créer un "bouton" avec le script afin de procéder à la mise à jour de l'onglet de destination ?

Personnellement, je préfère un menu

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 importer / rafraîchir les données', 'importData')
    .addToUi();
}

qui se mettra en place à l'ouverture

Encore mieux, je ne savais pas que les possibilités de personnalisation allaient jusqu'à ce point !!! Merci !
Dans la mesure où j'aurai plusieurs sources données, que me conseillez-vous ?

1. Un seul script pour tout / et une seule ligne dans le menu
2. Un script par source de données à importer / une ligne de menu par script

C'est comme tu veux. Je n'ai pas de préférence !

C'est rapide, néanmoins google n'autorise que 6mn par script (ce qui est à mon sens déjà beaucoup !)

Tu peux aussi faire tourner cet import la nuit, ou à l'heure que tu veux même fichier fermé avec un déclencheur (trigger) à définir en cliquant sur l'horloge à gauche dans l'éditeur de script

Excellent !!! Merci beaucoup pour ces précieux conseils !

Oups, petit problème avec le script. J'ai une base de données vraiment grande (que j'avais découpée avec plusieurs fonctions IMPORTRANGE).
Est-il envisageable de ne sélectionner que certaines colonnes dans le script (+ éventuellement une plage définie, ex : "H2500:H", P2500:P", ...) ?

capture d e cran 2022 05 05 a 15 44 11

Voici l'erreur renvoyée quand je l'exécute.

oui, tu peux découper en modifiant cette ligne

var data = ss.getSheetByName('LE NOM DE LA FEUILLE SOURCE').getDataRange().getValues()

par, par exemple

var sh = ss.getSheetByName('LE NOM DE LA FEUILLE SOURCE')
var data = sh.getRange('H2500:H'+sh.getLastRow()).getValues()

aprèss, avec de gros volumes, il faut passer à "google data studio" je crois

https://datastudio.google.com/u/0/

J'ai fait le test pour une colonne, cela fonctionnera parfaitement !
En revanche, je souhaite importer plusieurs colonnes : "H2500:H", "P2500:P", "T2500:T".
Comment intégrer cette suite dans le code ?

J'ai essayé de plusieurs manières, notamment en répétant la ligne "H", sans succès...

var data = sh.getRange('H2500:H'+sh.getLastRow()).getValues()

var data = sh.getRange('P2500:P'+sh.getLastRow()).getValues()

s'il n'y en a pas trop éloignées les unes des autres

var data = sh.getRange('H2500:P'+sh.getLastRow()).getValues()

sinon

var values1 = sh.getRange('H2500:H'+sh.getLastRow()).getValues()
var values2 = sh.getRange('P2500:P'+sh.getLastRow()).getValues()
etc.
var data = [...values1, ...values2];

quoique je crains que cela ne les empile, donc à prendre avec des pincettes

ou traiter séparément values1 et values2

Bonjour Steelson,

En effet, les données s'empilent dans la même colonne.
Qu'entends-tu par "traiter" séparément ? Etablir un script indépendant pour chaque colonne ?

En effet, les données s'empilent dans la même colonne.

Il faut donc les tarnsposer

essaie comme ceci (c'est un exemple que je viens de tester)

function importData(){
  var ss = SpreadsheetApp.openById('1n-rjSYb63Z2jySS3-M0BQ78vu8DTPOjG-SZM4i8IxXI'); 
  var sh = ss.getSheetByName('donnees')
  var values1 = sh.getRange('B2:B'+sh.getLastRow()).getValues()
  var values2 = sh.getRange('E2:E'+sh.getLastRow()).getValues()
  var data = transpose([...transpose(values1), ...transpose(values2)]);
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('mySheet')
  sh.getRange(1,1,data.length,data[0].length).setValues(data)
}
function transpose(a){
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}

Exemple validé !!!
Merci beaucoup pour ton aide Steelson !

Bonne fin de journée.

Rechercher des sujets similaires à "importrange autorisation acces"