Come posso ottenere Fogli Google per aggiornare automaticamente un riferimento a un altro foglio?


20

Sto utilizzando un'applicazione esterna per inserire dati in un foglio di calcolo di Google. Questa cartella di lavoro viene quindi referenziata da una cartella di lavoro separata (con la IMPORTRANGE(spreadsheet_key, range_string)funzione) che manipola e interpreta i dati. Il mio problema è che ogni volta che modifico personalmente la cartella di lavoro referenziata, la cartella di lavoro referenziante si aggiorna bene, ma ogni volta che l'applicazione esterna la modifica, non viene aggiornata.

Ho provato a modificare le "Impostazioni del foglio di calcolo" in modo che il ricalcolo venga eseguito ogni minuto e ad ogni modifica. Inoltre, ho installato anche un'estensione in Google Chrome che aggiorna automaticamente la pagina ogni ora. Tuttavia, i dati non vengono reimportati dalla cartella di lavoro di riferimento. Anche se copio la formula in una nuova cella, i dati non vengono comunque reimportati.

C'è qualcosa che posso fare nella cartella di lavoro di riferimento per attivare Fogli Google per reimportare i dati?

Modifica: solo per essere chiari, al momento ho una cartella di lavoro con i dati inseriti da un'applicazione esterna (chiamala "foglio di origine") e un'altra cartella di lavoro con una IMPORTRANGEfunzione (chiamala "foglio di riferimento"). I dati mostrati dalla IMPORTRANGEfunzione nel "foglio di riferimento" non includono alcun dato inserito dall'applicazione esterna dall'ultima modifica personale del "foglio di origine". Inoltre, entrambe le cartelle di lavoro utilizzano i nuovi Fogli Google.

Modifica: Inoltre, questa domanda non è la stessa di Come collego una cella in Fogli di lavoro di Google a una cella di un altro documento? perché sto usando la funzione fornita come soluzione a quella domanda per importare dati da un foglio di calcolo. Il problema non è come importare i dati, ma piuttosto come aggiornare l'origine per i dati. La mia ipotesi sarebbe che Google si sarebbe preso cura di questo per me, ma i dati nel "foglio di riferimento" non vengono aggiornati e l'unico modo che posso trovare per farlo aggiornare è di andare fisicamente nel "foglio di origine "e modificalo da solo.


Non sono a conoscenza dei dettagli di come funziona, ma sto usando quanto segue: ifttt.com/google_drive
tlewis3348

@pnuts Puoi spiegarci cosa intendi "assicurandoti che venga utilizzata la versione giusta come fonte"? Ho impostato le impostazioni per entrambi i fogli per l'aggiornamento ogni minuto e le schede sono impostate per l'aggiornamento ogni minuto. Come, dove e in quale foglio aggiorno la fonte?
tlewis3348,

@pnuts Bene, i dati vengono visualizzati nel modo separate workbookgiusto. Da tutte le apparenze, sembra che sia stato appena digitato.
tlewis3348

Sì, questo è il nuovo Google Sheets. Una cartella di lavoro mostra i dati aggiunti e l'altra cartella di lavoro no. Aggiungerò questo alla domanda originale per chiarimenti.
tlewis3348,

Risposte:


14

Ho lottato con lo stesso problema. Invece di scrivere una funzione personalizzata, aggiungo una stringa di query diversa spreadsheet_urlin IMPORTRANGEnella speranza che ogni volta che la pagina viene aggiornata, Google pensa che ha bisogno di recuperare i dati da un nuovo foglio di calcolo. Aggiungo semplicemente un nuovo timestamp per rendere l'URL unico ogni volta. È un trucco palese, ma ha funzionato per me su molti fogli.

La mia formula in precedenza era simile a:

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

E ora sembra:

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

Aggiornare:

Questo metodo non funziona più poiché Google non lo consente più now()all'interno importrange(). Vedi il commento di Hugh di seguito.


6
Ho trovato questa risposta quando ho provato a fare la stessa cosa. Sembra che Google l'abbia fatto in modo che now (), rand () e randbetween () non possano essere utilizzati all'interno di una chiamata importrange ().
Hugh,

Se imposto il foglio di calcolo per l'aggiornamento ogni minuto, la formula verrà aggiornata e recupererà nuovi dati (se disponibili)?
Nikhil Sahu l'

5

Quanto segue viene da Jimmy in questa risposta di app Web .

  1. In entrambi i fogli di calcolo inserisci =now()un'equazione in una cella casuale, diciamoZ1
  2. In entrambi i fogli di calcolo inserire una =importrange()funzione che faccia riferimento alla nowfunzione dell'altro foglio di calcolo.
  3. Accedi alle impostazioni del foglio di calcolo e scegli di ricalcolare ogni minuto.

Ho provato molti altri suggerimenti tra cui l'utilizzo della =now()funzione, il trucco ora URL in questo thread o lo script di app per inserire testo casuale in un intervallo prestabilito, ma nulla imporrebbe un importrange per l'aggiornamento se non una modifica manuale del foglio di origine.


Ha funzionato per me a dicembre 2018
MalcolmOcean

4

Ho scoperto che il modo più semplice era quello di mettere una semplice ifdichiarazione intorno al importrange.

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

Funziona sempre.


Ho cercato di implementare la tua soluzione ma non mi è chiaro come usare B3. Stai dicendo B3 = Now () allora=if (Now() > now()-1, IMPORTRANGE(B1,B2),)
Eugene van der Merwe

3

La soluzione alternativa al datestamp non sembra funzionare per me - c'è una nota esplicita che l'uso di datestamp e le funzioni rand non sono consentiti.

La mia soluzione molto caotica è eliminare la cella e quindi premere ctrl + z. Forza un aggiornamento ogni volta. È banale scrivere questo onopen o ad intervalli di tempo specifici per mantenere aggiornati i dati.


2

Ho trovato un semplice trucco per simulare un aggiornamento manuale delle celle e avviare modifiche in un foglio di calcolo esterno.

  1. Creata una funzione personalizzata come questa:

    // Hack function used just to simulate a manual update
    function hack(value) {
      var list = []
      list.push(value);
      return list;
    }
    
  2. Quindi, sul mio foglio, lo chiamo in questo modo:

    =arrayformula(hack(tab!B1))
    

    dove tab!B1è una delle celle che modifico per codice.


In che modo simula un aggiornamento manuale delle celle?
Guarda il

2

OPPURE ... potresti fare un semplice script, dando prima il valore cero (0) quindi includendo la formula indietro e questo fa il trucco:

  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\")");  

ancora meglio cell.setFormula ("=" & cell.getValue ()); così l'utente non vede lo zero per 2 secondi ....
Tony BenBrahim

1

Sono stato in grado di trovare un modo per risolvere il mio problema (dettagliato qui ) utilizzando uno script di app con una funzione personalizzata.

Se si sostituisce =IMPORTRANGE(spreadsheet_url, range_string)nel foglio di calcolo con =DynamicImportRange(spreadsheet_url, sheet_name, range)e si incolla il codice seguente in Strumenti -> Editor di script -> Progetto vuoto, dovrebbe funzionare (vedere questo per ulteriori informazioni sulla scrittura di script di app).

/**
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);
};

Se desideri che il foglio venga aggiornato regolarmente, puoi impostare un trigger andando su Risorse -> Trigger del progetto corrente nella finestra Script app.


4
PER TUTTI I GOOGLER FINITI QUI : le funzioni personalizzate del foglio di calcolo non possono aprire (più) altri fogli di calcolo utilizzando SpreadsheetApp.openById()o SpreadsheetApp.openByUrl(). Controlla qui e qui
Francesco Vadicamo,

1

Come soluzione alternativa per il now()roadblock, puoi modificare le impostazioni del foglio di calcolo per aggiornarle ogni ora.

File -> Impostazioni foglio di calcolo -> Calcolo

Aggiorna il foglio per ricalcolarlo su " Al cambio e ogni ora " o "Al cambio e ogni minuto". Tuttavia, tieni presente che la selezione del ricalcolo ogni minuto potrebbe riattaccare il foglio di calcolo.


0

Puoi utilizzare il componente aggiuntivo Sheetgo di Google Fogli per aggiornare automaticamente il tuo riferimento da un altro foglio. Puoi utilizzare 30 aggiornamenti gratuiti al mese o ottenere un abbonamento a pagamento per ulteriori aggiornamenti. Questo video dovrebbe spiegarti l'utilizzo di base.


2
Tieni presente che sebbene sia abilmente indicato sul sito " Installa gratuitamente ", si tratta di un componente aggiuntivo con un piano gratuito limitato seguito da 3 a pagamento . Il link al pagina dei prezzi si trova solo nella parte inferiore del sito.
marikamitsos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.