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 séparé (avec la fonction IMPORTRANGE(spreadsheet_key, range_string)
) 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érencement est mis à jour parfaitement, 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 soit effectué toutes les minutes et à chaque modification. 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.
Est-ce que je peux faire quelque chose pour que le classeur de référencement fasse en sorte que Google Sheets réimporte les données?
Modifier: Pour clarifier les choses, j’ai actuellement un classeur contenant des données saisies par une application externe (appelez-le "feuille source"), et un autre classeur contenant une fonction IMPORTRANGE
(appelez-le la "feuille de référence"). Les données affichées par la fonction IMPORTRANGE
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". De plus, les deux classeurs utilisent les nouvelles feuilles de calcul Google.
Modifier: De plus, cette question n'est pas la même chose 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'un tableur. 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 soit occupé de cela pour moi, mais les données de la "fiche de référencement" ne sont pas mises à jour, et le seul moyen que je peux trouver pour la mettre à jour consiste à accéder physiquement à la "feuille source". "et le modifier moi-même.
J'ai eu 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_url
dans IMPORTRANGE
, dans l'espoir que chaque fois que la page est actualisée, Google pense qu'il doit extraire 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 bidouillage 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")
Cette méthode ne fonctionne plus car Google n'autorise plus now()
à l'intérieur de importrange()
. Voir le commentaire de Hugh ci-dessous.
Ce qui suit provient de Jimmy dans cette réponse Web Apps .
=now()
dans une cellule aléatoire, par exemple, Z1
=importrange()
qui fait référence à la fonction now
de l'autre feuille de calcul.J'ai essayé beaucoup d'autres suggestions, y compris l'utilisation de la fonction =now()
, l'astuce d'URL maintenant dans ce fil, ou le script Apps pour insérer du texte au hasard sur un intervalle défini, mais rien ne force la mise à jour de importrange, à l'exception d'une édition manuelle. feuille source.
J'ai trouvé le moyen le plus simple de mettre une simple déclaration if
autour de importrange
.
B1 = Sheet ID
B2 = Sheet Name and Range
B3 = Now()
=if (B3> now()-1, IMPORTRANGE(B1,B2),)
Cela fonctionne à chaque fois.
La solution de contournement d'horodatage ne semble pas fonctionner pour moi - il y a une note explicite que l'utilisation d'horodatage et de fonctions Rand n'est pas autorisée.
Ma solution très simple consiste à supprimer la cellule, puis à appuyer sur ctrl + z. Il oblige un rafraîchissement à chaque fois. Il est trivial de script cette ouverture, ou à des intervalles de temps spécifiques pour garder les données à jour.
OU ... vous pouvez faire un script simple, en donnant d'abord la valeur cero (0), puis en incluant la formule, ce qui 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\")");
J'ai trouvé un moyen simple de simuler une mise à jour manuelle de la cellule et de lancer des modifications dans un tableur externe.
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;
}
Ensuite, sur ma feuille, je l’appelle ainsi:
=arrayformula(hack(tab!B1))
où tab!B1
est l'une des cellules que je modifie par code.
Pour contourner le roadblock now()
, vous pouvez modifier les paramètres de la feuille de calcul afin de les mettre à jour toutes les heures.
Fichier -> Paramètres de la feuille de calcul -> Calcul
Mettre à jour la feuille pour se recalculer sur "Sur changement et toutes les heures" ou "Sur changement et toutes les minutes". Gardez toutefois à l'esprit que, si vous sélectionnez un recalcul chaque minute, vous risquez de raccrocher la feuille de calcul.
J'ai été capable de trouver un moyen de résoudre mon problème (détaillé ici ) en utilisant un script Apps 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 -> Editeur de script -> Projet vide, cela devrait fonctionner (voir this pour plus d'informations). 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 accédant à Ressources -> Déclencheurs du projet actuel dans la fenêtre de script Apps.
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 gratuitement par mois ou obtenir un abonnement payant pour plus de mises à jour . Cette vidéo devrait vous expliquer l'utilisation de base.