Bagaimana saya bisa membuat Google Sheets memperbarui referensi ke sheet lain secara otomatis?

20

Saya menggunakan aplikasi eksternal untuk memasukkan data ke dalam Google Spreadsheet. Buku kerja ini kemudian direferensikan oleh buku kerja terpisah (dengan IMPORTRANGE(spreadsheet_key, range_string)fungsi) yang memanipulasi dan menafsirkan data. Masalah saya adalah bahwa setiap kali saya secara pribadi memodifikasi buku kerja yang direferensikan, buku kerja referensi memperbarui dengan baik, tetapi setiap kali aplikasi eksternal memodifikasinya, itu tidak diperbarui.

Saya telah mencoba mengedit "Pengaturan spreadsheet" sehingga penghitungan ulang dilakukan setiap menit dan pada setiap perubahan. Selain itu, saya juga telah menginstal ekstensi di Google Chrome yang secara otomatis me-refresh halaman setiap jam. Namun, data tidak dapat diimpor kembali dari buku kerja yang dirujuk. Bahkan jika saya menyalin rumus ke sel baru, data masih belum diimpor kembali.

Apakah ada yang bisa saya lakukan pada buku kerja referensi untuk memicu Google Sheets untuk mengimpor kembali data?

Sunting: Hanya untuk memperjelas, saat ini saya memiliki satu buku kerja dengan data yang dimasukkan oleh aplikasi eksternal di dalamnya (sebut saja "lembar sumber"), dan buku kerja lain dengan IMPORTRANGEfungsi di dalamnya (sebut saja "lembar referensi"). Data yang ditunjukkan oleh IMPORTRANGEfungsi di "lembar referensi" tidak termasuk data apa pun yang dimasukkan oleh aplikasi eksternal sejak saya terakhir kali secara pribadi mengedit "lembar sumber". Juga, kedua buku kerja menggunakan Lembar Google baru.

Sunting: Selain itu, pertanyaan ini tidak sama dengan Bagaimana cara menautkan sel di Google Spreadsheets ke sel di dokumen lain? karena saya menggunakan fungsi yang diberikan sebagai solusi untuk pertanyaan itu untuk mengimpor data dari spreadsheet. Masalahnya bukan bagaimana cara mengimpor data, melainkan bagaimana memperbarui sumber untuk data tersebut. Asumsi saya adalah bahwa Google akan mengurus ini untuk saya, tetapi data dalam "lembar referensi" tidak diperbarui, dan satu-satunya cara saya dapat menemukannya untuk memperbaruinya adalah dengan secara fisik masuk ke "lembar sumber" "dan edit sendiri.

tlewis3348
sumber
Saya tidak mengetahui detail cara kerjanya, tetapi saya menggunakan yang berikut ini: ifttt.com/google_drive
tlewis3348
@pnuts Bisakah Anda menjelaskan apa yang Anda maksud dengan "memastikan bahwa versi yang tepat digunakan sebagai sumber"? Saya memiliki pengaturan untuk kedua lembar yang diatur untuk memperbarui setiap menit dan tab diatur untuk menyegarkan setiap menit. Bagaimana, di mana, dan di lembar mana saya memperbarui sumber?
tlewis3348
@ kacang Nah, data muncul di separate workbookoke. Dari semua penampilan, sepertinya baru saja diketik.
tlewis3348
Ya, ini adalah Google Sheets baru. Satu buku kerja menunjukkan data yang ditambahkan, dan buku kerja lainnya tidak. Saya akan menambahkan ini ke pertanyaan awal untuk klarifikasi.
tlewis3348

Jawaban:

14

Saya telah berjuang dengan masalah yang sama. Alih-alih menulis fungsi kustom, saya menambahkan query string yang berbeda untuk spreadsheet_urldi IMPORTRANGEharapan bahwa setiap kali halaman di-refresh, Google menganggap perlu untuk mengambil data dari spreadsheet baru. Saya cukup menambahkan cap waktu baru untuk membuat url unik setiap kali. Ini adalah retasan terang-terangan, tetapi telah bekerja untuk saya di banyak lembar.

Formula saya sebelumnya terlihat seperti:

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

Dan sekarang terlihat seperti:

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

Memperbarui:

Metode ini tidak lagi berfungsi karena Google tidak lagi mengizinkan now()di dalam importrange(). Lihat komentar dari Hugh di bawah ini.

Sam Collins
sumber
6
Saya menemukan jawaban ini ketika mencoba melakukan hal yang sama. Sepertinya Google telah membuatnya sehingga sekarang (), rand () dan randbetween () tidak dapat digunakan di dalam panggilan importrange ().
Hugh
Jika saya mengatur spreadsheet agar diperbarui setiap menit, apakah rumus juga akan disegarkan dan mengambil data baru (jika tersedia)?
Nikhil Sahu
5

Berikut ini datang dari Jimmy dalam jawaban Aplikasi Web ini .

  1. Di kedua spreadsheet, masukkan =now()persamaan dalam sel acak, misalnyaZ1
  2. Di kedua spreadsheet, masukkan =importrange()fungsi yang mereferensikan nowfungsi spreadsheet lainnya.
  3. Buka pengaturan spreadsheet Anda dan pilih untuk menghitung ulang setiap menit.

Saya mencoba banyak saran lain termasuk menggunakan =now()fungsi, trik URL sekarang di utas ini, atau Apps Script untuk menyisipkan teks acak pada interval yang ditetapkan, tetapi tidak ada yang akan memaksa importrange untuk memperbarui kecuali mengedit manual dari lembar sumber.

Tony
sumber
Bekerja untuk saya pada Desember 2018
MalcolmOcean
4

Saya menemukan cara termudah adalah dengan meletakkan ifpernyataan sederhana di sekitar importrange.

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

Ini berfungsi setiap saat.

Brett Hawthorne
sumber
Saya sudah mencoba menerapkan solusi Anda tetapi tidak jelas bagi saya bagaimana menggunakan B3. Anda maksud Anda B3 = Sekarang ()=if (Now() > now()-1, IMPORTRANGE(B1,B2),)
Eugene van der Merwe
3

Pemecahan masalah datestamp tampaknya tidak berfungsi untuk saya - ada catatan eksplisit bahwa menggunakan datestamps dan fungsi rand tidak diperbolehkan.

Solusi saya yang sangat rumit adalah menghapus sel dan kemudian tekan ctrl + z. Ini memaksa penyegaran setiap waktu. Sepele untuk membuka script ini, atau pada interval waktu tertentu untuk menjaga data tetap segar.

Tom McGuinness
sumber
2

Saya menemukan retas sederhana untuk mensimulasikan pembaruan sel manual dan meluncurkan modifikasi dalam spreadsheet eksternal.

  1. Membuat fungsi khusus seperti ini:

    // Hack function used just to simulate a manual update
    function hack(value) {
      var list = []
      list.push(value);
      return list;
    }
    
  2. Kemudian, pada lembar saya, saya menyebutnya dengan cara ini:

    =arrayformula(hack(tab!B1))
    

    di mana tab!B1salah satu sel saya modifikasi dengan kode.

javi
sumber
Bagaimana ini mensimulasikan pembaruan sel manual?
haemse
2

ATAU ... Anda bisa melakukan skrip sederhana, pertama memberikan nilai cero (0) kemudian memasukkan formula kembali dan ini lakukan triknya:

  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
sumber
bahkan lebih baik cell.setFormula ("=" & cell.getValue ());, sehingga pengguna tidak melihat nol selama 2 detik ....
Tony BenBrahim
1

Saya dapat menemukan cara untuk menyelesaikan masalah saya (dirinci di sini ) menggunakan Skrip Aplikasi dengan fungsi khusus.

Jika Anda mengganti =IMPORTRANGE(spreadsheet_url, range_string)dalam spreadsheet Anda dengan =DynamicImportRange(spreadsheet_url, sheet_name, range)dan menempelkan kode di bawah ini ke Alat -> Editor Skrip -> Proyek Kosong, itu akan berfungsi (lihat ini untuk informasi lebih lanjut tentang penulisan skrip aplikasi).

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

Jika Anda ingin sheet diperbarui secara berkala, Anda dapat mengatur pemicu dengan membuka Sumber Daya -> Pemicu proyek saat ini di jendela Skrip Aplikasi.

tlewis3348
sumber
4
UNTUK SEMUA GOOGLER AKHIR DI SINI : fungsi kustom spreadsheet tidak dapat membuka (lagi) spreadsheet lain menggunakan SpreadsheetApp.openById()atau SpreadsheetApp.openByUrl(). Periksa di sini dan di sini
Francesco Vadicamo
1

Sebagai solusi untuk now()penghalang jalan, Anda dapat mengubah pengaturan spreadsheet untuk memperbarui setiap jam.

File -> Pengaturan Spreadsheet -> Perhitungan

Perbarui lembar untuk menghitung ulang sendiri pada " Saat Berubah dan setiap jam " atau "Saat berganti dan setiap menit". Meskipun perlu diingat, Memilih penghitungan ulang setiap menit dapat menutup spreadsheet.

Nikhil Sahu
sumber
0

Anda dapat menggunakan add-on Sheetgo Google untuk memperbarui referensi Anda dari sheet lain secara otomatis. Anda dapat menggunakan 30 pembaruan secara gratis per bulan atau mendapatkan langganan berbayar untuk pembaruan lainnya. Video ini harus menjelaskan kepada Anda penggunaan dasar.

orschiro
sumber
2
Harap diingat bahwa meskipun secara cerdik dinyatakan di situs " Instal secara Gratis ", ini adalah tambahan dengan satu paket gratis terbatas diikuti oleh 3 paket berbayar . Tautan ke halaman Harga hanya dapat ditemukan di bagian paling bawah situs.
marikamitsos