¿Cómo puedo hacer que Google Sheets actualice automáticamente una referencia a otra hoja?

20

Estoy usando una aplicación externa para ingresar datos en una hoja de cálculo de Google. Este libro de trabajo es referenciado por un libro de trabajo separado (con la IMPORTRANGE(spreadsheet_key, range_string)función) que manipula e interpreta los datos. Mi problema es que cada vez que modifico personalmente el libro de trabajo al que se hace referencia, el libro de referencia se actualiza muy bien, pero cada vez que la aplicación externa lo modifica, no se actualiza.

He intentado editar la "Configuración de la hoja de cálculo" para que el recálculo se realice cada minuto y en cada cambio. Además, también instalé una extensión en Google Chrome que actualiza automáticamente la página cada hora. Sin embargo, los datos no se vuelven a importar del libro de referencia. Incluso si copio la fórmula en una nueva celda, los datos aún no se vuelven a importar.

¿Hay algo que pueda hacer al libro de referencia para que Google Sheets vuelva a importar los datos?

Editar: para ser claros, actualmente tengo un libro de trabajo con datos ingresados ​​por una aplicación externa (llámelo "hoja de origen") y otro libro con una IMPORTRANGEfunción (llámelo "hoja de referencia"). Los datos mostrados por la IMPORTRANGEfunción en la "hoja de referencia" no incluyen ningún dato ingresado por la aplicación externa desde la última vez que edité personalmente la "hoja de origen". Además, ambos libros están utilizando las nuevas Hojas de cálculo de Google.

Editar: Además, esta pregunta no es lo mismo que ¿Cómo puedo vincular una celda en Google Spreadsheets a una celda en otro documento? porque estoy usando la función dada como la solución a esa pregunta para importar datos de una hoja de cálculo. El problema no es cómo importar los datos, sino cómo actualizar el origen de los datos. Supongo que Google se habría encargado de esto por mí, pero los datos en la "hoja de referencia" no se actualizan, y la única forma que puedo encontrar para actualizarlo es ir físicamente a la "hoja de origen". "y editarlo yo mismo.

tlewis3348
fuente
No conozco los detalles de cómo funciona, pero estoy usando lo siguiente: ifttt.com/google_drive
tlewis3348
@pnuts ¿Puede explicar lo que quiere decir con "asegurarse de que se utiliza la versión correcta como fuente"? Tengo la configuración de ambas hojas configuradas para actualizarse cada minuto y las pestañas están configuradas para actualizarse cada minuto. ¿Cómo, dónde y en qué hoja actualizo la fuente?
tlewis3348
@pnuts Bueno, los datos se muestran en la separate workbookautorización. Según todas las apariencias, parece que se acaba de teclear en.
tlewis3348
Sí, estas son las nuevas Hojas de cálculo de Google. Un libro de trabajo muestra los datos agregados y el otro libro no. Agregaré esto a la pregunta original para aclarar.
tlewis3348

Respuestas:

14

He estado luchando con el mismo problema. En lugar de escribir una función personalizada, agrego una cadena de consulta diferente aspreadsheet_url en IMPORTRANGEla esperanza de que cada vez que se actualiza la página, Google piensa que necesita para obtener los datos de una nueva hoja de cálculo. Simplemente agrego una nueva marca de tiempo para que la url sea única cada vez. Es un truco descarado, pero me ha funcionado en muchas hojas.

Mi fórmula anteriormente se parecía a:

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

Y ahora se ve así:

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

Actualizar:

Este método ya no funciona ya que Google ya no permite now()entrar importrange(). Ver comentario de Hugh a continuación.

Sam Collins
fuente
66
Encontré esta respuesta cuando intentaba hacer lo mismo. Parece que Google lo ha hecho para que now (), rand () y randbetween () no puedan usarse dentro de una llamada importrange ().
Hugh
Si configuro la hoja de cálculo para que se actualice cada minuto, ¿la fórmula también se actualizará y buscará nuevos datos (si están disponibles)?
Nikhil Sahu
5

Lo siguiente viene de Jimmy en esta respuesta de Web Apps .

  1. En ambas hojas de cálculo, inserte una =now()ecuación en una celda aleatoria, digamosZ1
  2. En ambas hojas de cálculo, inserte una =importrange()función que haga referencia a la nowfunción de la otra hoja de cálculo.
  3. Vaya a la configuración de su hoja de cálculo y elija volver a calcular cada minuto.

Intenté muchas otras sugerencias, incluido el uso de la =now()función, el truco de la URL ahora en este hilo o el Script de aplicaciones para insertar texto aleatorio en un intervalo establecido, pero nada obligaría a actualizar importrange excepto una edición manual de la hoja de origen.

Tony
fuente
Trabajó para mí en diciembre de 2018
MalcolmOcean
4

Encontré que la forma más fácil era poner una ifdeclaración simple alrededor del importrange.

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

Esto funciona todo el tiempo.

Brett Hawthorne
fuente
He estado tratando de implementar su solución, pero no tengo claro cómo usar B3. Estás diciendo B3 = Ahora () entonces=if (Now() > now()-1, IMPORTRANGE(B1,B2),)
Eugene van der Merwe
3

La solución alternativa de fecha y hora no parece funcionar para mí: hay una nota explícita de que no se permite el uso de fecha y funciones rand.

Mi solución alternativa es eliminar la celda y luego presionar ctrl + z. Fuerza una actualización cada vez. Es trivial escribir esta secuencia abierta, o en intervalos de tiempo específicos para mantener los datos actualizados.

Tom McGuinness
fuente
2

Encontré un truco simple para simular una actualización celular manual y lanzar modificaciones en una hoja de cálculo externa.

  1. Creó una función personalizada como esta:

    // Hack function used just to simulate a manual update
    function hack(value) {
      var list = []
      list.push(value);
      return list;
    }
    
  2. Luego, en mi hoja lo llamo de esta manera:

    =arrayformula(hack(tab!B1))
    

    donde tab!B1es una de las celdas que modifico por código.

javi
fuente
¿Cómo simula esto una actualización celular manual?
haemse
2

O ... podría hacer un script simple, primero dando el valor cero (0), luego incluyendo la fórmula y esto hace el truco:

  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
fuente
incluso mejor sería cell.setFormula ("=" & cell.getValue ()) ;, por lo que el usuario no ve cero durante 2 segundos ...
Tony BenBrahim
1

Pude encontrar una manera de resolver mi problema (detallado aquí ) usando un Script de aplicaciones con una función personalizada.

Si reemplaza =IMPORTRANGE(spreadsheet_url, range_string)en su hoja de cálculo =DynamicImportRange(spreadsheet_url, sheet_name, range)y pega el siguiente código en Herramientas -> Editor de scripts -> Proyecto en blanco, debería funcionar (consulte esto para obtener más información sobre cómo escribir scripts de aplicaciones).

/**
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 desea que la hoja se actualice regularmente, puede configurar un activador yendo a Recursos -> Activadores del proyecto actual en la ventana de Script de aplicaciones.

tlewis3348
fuente
44
PARA TODOS los GOOGLERS TERMINE AQUÍ : las funciones personalizadas de la hoja de cálculo no pueden abrir (ya) otras hojas de cálculo usando SpreadsheetApp.openById()o SpreadsheetApp.openByUrl(). Mira aquí y aquí
Francesco Vadicamo
1

Como solución alternativa para la now()publicación roadblock, puede cambiar la configuración de la hoja de cálculo para actualizar cada hora.

Archivo -> Configuración de hoja de cálculo -> Cálculo

Actualice la hoja para volver a calcular en " Al cambiar y cada hora " o "Al cambiar y cada minuto". Sin embargo, tenga en cuenta que seleccionar el recálculo cada minuto puede colgar la hoja de cálculo.

Nikhil Sahu
fuente
0

Puede usar el complemento Sheetgo de Google Sheets para actualizar automáticamente su referencia desde otra hoja. Puede usar 30 actualizaciones gratis por mes u obtener una suscripción paga para obtener más actualizaciones. Este video debería explicar el uso básico.

orschiro
fuente
2
Tenga en cuenta que, aunque se menciona de forma inteligente en el sitio " Instalar de forma gratuita ", es un complemento con un plan gratuito limitado seguido de 3 pagos . El enlace a la página de precios solo se encuentra en la parte inferior del sitio.
marikamitsos