Comment puis-je demander à Google Sheets de mettre à jour automatiquement une référence à une autre feuille?

20

J'utilise une application externe pour saisir des données dans une feuille de calcul Google. Ce classeur est ensuite référencé par un classeur distinct (avec la IMPORTRANGE(spreadsheet_key, range_string)fonction) qui manipule et interprète les données. Mon problème est que chaque fois que je modifie personnellement le classeur référencé, le classeur de référence se met à jour très bien, mais chaque fois que l'application externe le modifie, il n'est pas mis à jour.

J'ai essayé de modifier les "Paramètres de la feuille de calcul" afin que le recalcul se fasse à chaque minute et à chaque changement. De plus, j'ai également installé une extension dans Google Chrome qui actualise automatiquement la page toutes les heures. Toutefois, les données ne sont pas réimportées à partir du classeur référencé. Même si je copie la formule dans une nouvelle cellule, les données ne sont toujours pas réimportées.

Y a-t-il quelque chose que je puisse faire pour que le classeur de référencement déclenche la réimportation des données par Google Sheets?

Edit: Juste pour être clair, j'ai actuellement un classeur avec des données entrées par une application externe (appelez-le la "feuille source"), et un autre classeur avec une IMPORTRANGEfonction (appelez-le la "feuille de référence"). Les données affichées par la IMPORTRANGEfonction dans la "feuille de référence" n'incluent aucune donnée entrée par l'application externe depuis la dernière modification personnelle de la "feuille source". En outre, les deux classeurs utilisent les nouvelles feuilles de calcul Google.

Modifier: En outre, cette question n'est pas la même que Comment lier une cellule de Google Spreadsheets à une cellule d'un autre document? parce que j'utilise la fonction donnée comme solution à cette question pour importer des données à partir d'une feuille de calcul. Le problème n'est pas de savoir comment importer les données, mais plutôt comment mettre à jour la source des données. Mon hypothèse serait que Google se serait occupé de cela pour moi, mais les données de la "feuille de référence" ne sont pas mises à jour, et la seule façon que je puisse trouver pour la mettre à jour est d'aller physiquement dans la "feuille source" "et le modifier moi-même.

tlewis3348
la source
Je ne connais pas les détails de son fonctionnement, mais j'utilise ce qui suit: ifttt.com/google_drive
tlewis3348
@pnuts Pouvez-vous expliquer ce que vous entendez par "s'assurer que la bonne version est utilisée comme source"? J'ai les paramètres des deux feuilles mis à jour toutes les minutes et les onglets sont mis à jour toutes les minutes. Comment, où et dans quelle feuille puis-je mettre à jour la source?
tlewis3348
@pnuts Eh bien, les données apparaissent separate workbookcorrectement. De toutes les apparences, on dirait qu'il vient d'être tapé.
tlewis3348
Oui, ce sont les nouvelles feuilles de calcul Google. Un classeur affiche les données ajoutées et l'autre classeur ne le fait pas. J'ajouterai ceci à la question d'origine pour clarification.
tlewis3348

Réponses:

14

J'ai du mal avec le même problème. Au lieu d'écrire une fonction personnalisée, j'ajoute une chaîne de requête différente spreadsheet_urldans IMPORTRANGEdans l'espoir que chaque fois que la page est actualisée, Google pense qu'il a besoin de récupérer les données d'une nouvelle feuille de calcul. J'ajoute simplement un nouvel horodatage pour rendre l'URL unique à chaque fois. C'est un hack flagrant, mais cela a fonctionné pour moi sur beaucoup de feuilles.

Ma formule ressemblait auparavant à quelque chose comme:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174","'Sheet1'!A1:B25")

Et maintenant ça ressemble à:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174"&"?"&now(),"'Sheet1'!A1:B25")

Mise à jour:

Cette méthode ne fonctionne plus puisque Google n'autorise plus l' now()intérieur importrange(). Voir le commentaire de Hugh ci-dessous.

Sam Collins
la source
6
Je suis tombé sur cette réponse en essayant de faire la même chose. Il semble que Google ait fait en sorte que now (), rand () et randbetween () ne puissent pas être utilisés dans un appel importrange ().
Hugh
Si je mets la feuille de calcul à jour toutes les minutes, la formule sera-t-elle également actualisée et récupérera de nouvelles données (si disponibles)?
Nikhil Sahu
5

Ce qui suit vient de Jimmy dans cette réponse Web Apps .

  1. Dans les deux feuilles de calcul, insérez une =now()équation dans une cellule aléatoire, par exempleZ1
  2. Dans les deux feuilles de calcul, insérez une =importrange()fonction qui fait référence à la nowfonction de l'autre feuille de calcul.
  3. Accédez à vos paramètres de feuille de calcul et choisissez de recalculer chaque minute.

J'ai essayé beaucoup d'autres suggestions, notamment en utilisant la =now()fonction, l'astuce URL maintenant dans ce fil, ou Apps Script pour insérer du texte aléatoire sur un intervalle défini, mais rien ne forcerait importrange à mettre à jour, sauf une modification manuelle de la feuille source.

Tony
la source
A travaillé pour moi en décembre 2018
MalcolmOcean
4

J'ai trouvé que le moyen le plus simple était de mettre une simple ifdéclaration autour du importrange.

B1 = Sheet ID
B2 = Sheet Name and Range
B3 = Now()
=if (B3> now()-1, IMPORTRANGE(B1,B2),)

Cela fonctionne à chaque fois.

Brett Hawthorne
la source
J'ai essayé d'implémenter votre solution, mais je ne sais pas comment utiliser B3. Vous êtes en train de dire B3 = Now () then=if (Now() > now()-1, IMPORTRANGE(B1,B2),)
Eugene van der Merwe
3

La solution de contournement de l'horodatage ne semble pas fonctionner pour moi - il y a une note explicite que l'utilisation des horodatages et des fonctions rand n'est pas autorisée.

Ma solution de contournement très hacky consiste à supprimer la cellule, puis à appuyer sur Ctrl + Z. Il force un rafraîchissement à chaque fois. Il est trivial de créer un script à l'ouverture ou à des intervalles de temps spécifiques pour conserver les données à jour.

Tom McGuinness
la source
2

J'ai trouvé un hack simple pour simuler une mise à jour manuelle des cellules et lancer des modifications dans une feuille de calcul externe.

  1. A créé une fonction personnalisée comme celle-ci:

    // Hack function used just to simulate a manual update
    function hack(value) {
      var list = []
      list.push(value);
      return list;
    }
    
  2. Ensuite, sur ma feuille, je l'appelle ainsi:

    =arrayformula(hack(tab!B1))
    

    tab!B1est l'une des cellules que je modifie par code.

javi
la source
Comment cela simule-t-il une mise à jour manuelle des cellules?
haemse
2

OU ... vous pouvez faire un script simple, en donnant d'abord la valeur cero (0) puis en incluant la formule et cela fait l'affaire:

  var cell = sheet.getRange("B1:B1"); //SHEET TO INSERT VALUE
  cell.setFormula("=0");
   Utilities.sleep(2000); //JUST TO GIVE TIME TO UPDATE (OPTIONAL)
  var cell = sheet.getRange("B1:B1");
  cell.setFormula("=ImportRange(\"YOUR_SHEET_ID\",\"RANGE_TO_INSERT\")");  
Samuel Félix
la source
encore mieux serait cell.setFormula ("=" & cell.getValue ()) ;, de sorte que l'utilisateur ne voit pas zéro pendant 2 secondes ....
Tony BenBrahim
1

J'ai pu trouver un moyen de résoudre mon problème (détaillé ici ) en utilisant un script d'applications avec une fonction personnalisée.

Si vous remplacez =IMPORTRANGE(spreadsheet_url, range_string)dans votre feuille de calcul par =DynamicImportRange(spreadsheet_url, sheet_name, range)et collez le code ci-dessous dans Outils -> Éditeur de script -> Projet vide, cela devrait fonctionner (voir ceci pour plus d'informations sur l'écriture de scripts d'applications).

/**
Usage: =DynamicImportRange(spreadsheet_url, sheet_name, range)
Compare to: =IMPORTRANGE(spreadsheet_url, range_string)

Where the given arguments are placeholders that should be replaced
by arguments specific to your use-case.
 */
function DynamicImportRange(sheet_url, sheet_name, sheet_range) {
  var values = SpreadsheetApp.openByUrl(sheet_url).getSheetByName(sheet_name).getRange(sheet_range).getValues();
  return values
};

/**
*/
function RefreshSheet() {
  // Update the following two variables to suit your particular situation
  var sheet_name = "sample_sheet_sheet"
  var range = "A1"

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
  var formula1 = "Loading...";
  var formula2 = sheet.getRange(range).getFormula().toString().replace('"', '\"');
  // The following assumes that the data is being inserted into the sheet in the same
  // location as it is in in the source sheet.
  var form_range = formula2.split(",")[2].split("\"")[1];
  sheet.getRange(form_range).clear();
  sheet.getRange(range).setValue(formula1);
  Utilities.sleep(245);
  sheet.getRange(range).setValue(formula2);
};

Si vous souhaitez que la feuille soit mise à jour régulièrement, vous pouvez configurer un déclencheur en allant dans Ressources -> Déclencheurs du projet actuel dans la fenêtre Script des applications.

tlewis3348
la source
4
POUR TOUS LES GOOGLERS, TERMINEZ ICI : les fonctions personnalisées des feuilles de calcul ne peuvent plus ouvrir (plus) d'autres feuilles de calcul à l'aide de SpreadsheetApp.openById()ou SpreadsheetApp.openByUrl(). Vérifiez ici et ici
Francesco Vadicamo
1

Pour contourner le now()roadblock, vous pouvez modifier les paramètres de la feuille de calcul pour la mettre à jour toutes les heures.

Fichier -> Paramètres de la feuille de calcul -> Calcul

Mettez à jour la feuille pour recalculer elle-même sur " Au changement et toutes les heures " ou "Au changement et toutes les minutes". Gardez à l'esprit que la sélection d'un recalcul toutes les minutes peut bloquer le tableur.

Nikhil Sahu
la source
0

Vous pouvez utiliser le module complémentaire Google Sheets Sheetgo pour mettre à jour automatiquement votre référence à partir d'une autre feuille. Vous pouvez utiliser 30 mises à jour gratuites par mois ou obtenir un abonnement payant pour plus de mises à jour. Cette vidéo devrait vous expliquer l'utilisation de base.

orschiro
la source
2
Veuillez garder à l'esprit que bien qu'il soit habilement indiqué sur le site " Installer gratuitement ", il s'agit d'un module complémentaire avec un plan gratuit limité suivi de 3 plans payants . Le lien vers la page Tarification se trouve uniquement tout en bas du site.
marikamitsos