Como faço para que o Planilhas Google atualize automaticamente uma referência para outra planilha?

20

Estou usando um aplicativo externo para inserir dados em uma planilha do Google. Esta pasta de trabalho é referenciada por uma pasta de trabalho separada (com a IMPORTRANGE(spreadsheet_key, range_string)função) que manipula e interpreta os dados. Meu problema é que sempre que eu modifico pessoalmente a pasta de trabalho referenciada, a pasta de trabalho de referência é atualizada, mas sempre que o aplicativo externo a modifica, ela não é atualizada.

Tentei editar as "Configurações da planilha" para que o recálculo seja feito a cada minuto e a cada alteração. Além disso, também instalei uma extensão no Google Chrome que atualiza automaticamente a página a cada hora. No entanto, os dados não são reimportados da pasta de trabalho referenciada. Mesmo se eu copiar a fórmula em uma nova célula, os dados ainda não serão reimportados.

Há algo que eu possa fazer na pasta de trabalho de referência para acionar o Planilhas Google para reimportar os dados?

Editar: Só para esclarecer, atualmente tenho uma pasta de trabalho com dados inseridos por um aplicativo externo (chame-a de "planilha de origem") e outra pasta de trabalho com uma IMPORTRANGEfunção (chame-a de "planilha de referência"). Os dados mostrados pela IMPORTRANGEfunção na "folha de referência" não incluem nenhum dado inserido pelo aplicativo externo desde a última vez que editei pessoalmente a "folha de origem". Além disso, as duas pastas de trabalho estão usando as novas planilhas do Google.

Editar: Além disso, esta pergunta não é a mesma de Como vincular uma célula nas planilhas do Google a uma célula em outro documento? porque estou usando a função fornecida como solução para essa pergunta para importar dados de uma planilha. O problema não é como importar os dados, mas como atualizar a fonte dos dados. Minha suposição seria que o Google cuidaria disso para mim, mas os dados na "planilha de referência" não são atualizados, e a única maneira que eu posso encontrar para atualizar é entrar fisicamente na "planilha de origem "e edite-o eu mesmo.

tlewis3348
fonte
Eu não estou ciente dos detalhes de como ele funciona, mas eu estou usando o seguinte: ifttt.com/google_drive
tlewis3348
@pnuts Você pode explicar o que quer dizer com "garantir que a versão correta seja usada como fonte"? Eu tenho as configurações das duas folhas definidas para atualizar a cada minuto e as guias definidas para atualizar a cada minuto. Como, onde e em qual planilha atualizo a fonte?
Tlwis3348
@pnuts Bem, os dados estão aparecendo separate workbookbem. De todas as aparências, parece que ele estava apenas digitada.
tlewis3348
Sim, este é o novo Planilhas Google. Uma pasta de trabalho mostra os dados adicionados e a outra pasta não. Acrescentarei isso à pergunta original para esclarecimento.
Tlwis3348

Respostas:

14

Eu tenho lutado com o mesmo problema. Em vez de escrever uma função personalizada, eu adicionar uma string de consulta diferente para spreadsheet_urlnos IMPORTRANGEna esperança de que cada vez que a página é atualizada, o Google acha que ele precisa buscar dados de uma nova planilha. Simplesmente acrescento um novo carimbo de data / hora para tornar o URL único a cada vez. É um truque flagrante, mas tem funcionado para mim em várias folhas.

Minha fórmula anteriormente parecia algo como:

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

E agora parece com:

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

Atualizar:

Esse método não funciona mais, já que o Google não permite mais now()entrar importrange(). Veja o comentário de Hugh abaixo.

Sam Collins
fonte
6
Me deparei com essa resposta ao tentar fazer a mesma coisa. Parece que o Google fez com que agora (), rand () e randbetween () não possam ser usados ​​dentro de uma chamada importrange ().
Hugh
Se eu definir a planilha para atualizar a cada minuto, a fórmula também será atualizada e buscará novos dados (se disponíveis)?
Nikhil Sahu 11/01
5

O seguinte é de Jimmy nesta resposta de aplicativos da Web .

  1. Nas duas planilhas, insira uma =now()equação em uma célula aleatória, digamosZ1
  2. Nas duas planilhas, insira uma =importrange()função que faça referência à nowfunção da outra planilha.
  3. Vá para as configurações da planilha e escolha recalcular a cada minuto.

Tentei muitas outras sugestões, incluindo o uso da =now()função, o truque do URL agora neste segmento ou o Script do Apps para inserir texto aleatório em um intervalo definido, mas nada forçaria a atualização importante, exceto uma edição manual da planilha de origem.

Tony
fonte
Trabalhou para mim em dezembro de 2018
MalcolmOcean 4/18/18
4

Eu achei a maneira mais fácil de colocar uma ifdeclaração simples em torno do importrange.

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

Isso funciona sempre.

Brett Hawthorne
fonte
Eu tenho tentado implementar sua solução, mas não está claro para mim como usar o B3. Você está dizendo B3 = Agora () então #=if (Now() > now()-1, IMPORTRANGE(B1,B2),)
Eugene van der Merwe
3

A solução alternativa para o carimbo de data / hora não parece funcionar para mim - há uma observação explícita de que o uso de carimbos de data e funções de rand não é permitido.

Minha solução alternativa muito hacky é excluir a célula e pressionar ctrl + z. Força uma atualização sempre. É trivial escrever esse script em aberto, ou em intervalos de tempo específicos, para manter os dados atualizados.

Tom McGuinness
fonte
2

Eu encontrei um hack simples para simular uma atualização manual da célula e iniciar modificações em uma planilha externa.

  1. Criou uma função personalizada como esta:

    // Hack function used just to simulate a manual update
    function hack(value) {
      var list = []
      list.push(value);
      return list;
    }
    
  2. Então, na minha planilha eu chamo assim:

    =arrayformula(hack(tab!B1))
    

    onde tab!B1é uma das células que modifico por código.

javi
fonte
Como isso simula uma atualização manual da célula?
haemse
2

OU ... você pode criar um script simples, primeiro fornecendo o valor cero (0) e, em seguida, incluindo a fórmula de volta e faça o seguinte:

  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
fonte
ainda melhor seria cell.setFormula ( "=" & cell.getValue ()) ;, para que o usuário não vê zero para 2 segundos ....
Tony Benbrahim
1

Consegui encontrar uma maneira de resolver meu problema (detalhado aqui ) usando um Script do Google Apps com uma função personalizada.

Se você substituir =IMPORTRANGE(spreadsheet_url, range_string)em sua planilha =DynamicImportRange(spreadsheet_url, sheet_name, range)e colar o código abaixo em Ferramentas -> Editor de scripts -> Projeto em branco, ele deverá funcionar (consulte isso para obter mais informações sobre como escrever scripts de aplicativos).

/**
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 você deseja que a planilha seja atualizada regularmente, é possível configurar um gatilho indo para Recursos -> Gatilhos do projeto atual na janela Script de aplicativos.

tlewis3348
fonte
4
PARA TODOS OS GOOGRADORES FINALIZADOS AQUI : as funções personalizadas da planilha não podem abrir (mais) outras planilhas usando SpreadsheetApp.openById()ou SpreadsheetApp.openByUrl(). Verifique aqui e aqui
Francesco Vadicamo 30/03
1

Como solução alternativa para o now()roadblock, você pode alterar as configurações da planilha para atualizar a cada hora.

Arquivo -> Configurações da planilha -> Cálculo

Atualize a planilha para recalcular-se em " Na mudança e a cada hora " ou "Na mudança e a cada minuto". Embora tenha em mente, a seleção do recálculo a cada minuto pode interromper a planilha.

Nikhil Sahu
fonte
0

Você pode usar o Sheetgo complementar do Planilhas Google para atualizar automaticamente sua referência de outra planilha. Você pode usar 30 atualizações gratuitamente por mês ou obter uma assinatura paga para obter mais atualizações. Este vídeo deve explicar o uso básico.

orschiro
fonte
2
Lembre-se de que, embora esteja habilmente indicado no site " Instalar de graça ", é um complemento com um plano gratuito limitado, seguido por 3 pagos . O link para a página Preços está apenas na parte inferior do site.
Marikamitsos