Apa yang spreadsheetapp siram ();

Itu berhasil mengatur rumus di tempat yang saya inginkan, tetapi bagian copyTo meninggalkan saya dengan kolom B2 kosong. Jika saya mengabaikan {contentsOnly. true} isinya disalin ke kolom B2, tetapi saya hanya perlu menyalin nilai, bukan rumusnya.  

Saya gagal memahami apa yang dilakukan dengan tidak benar

Seperti yang mungkin Anda duga, sebagian besar skrip membaca dari atau menulis ke spreadsheet, jadi menurut kami akan bermanfaat untuk membagikan beberapa praktik terbaik untuk membuat otomatisasi spreadsheet secepat dan seefisien mungkin

Mari kita mulai dengan prinsip umum. Operasi JavaScript jauh lebih cepat daripada berbicara dengan layanan apa pun. Dengan kata lain, apa pun yang dapat dilakukan Apps Script dengan sendirinya akan menjadi sangat cepat, sementara berbicara dengan Spreadsheet, Terjemahan, Situs, dll, akan jauh lebih lambat. Saran terbaik di sini adalah menelepon layanan dengan hemat - operasi spreadsheet yang paling murah adalah tidak operasi spreadsheet.

Jelas meskipun seluruh tujuan Apps Script adalah untuk bertindak sebagai perekat antara semua layanan ini, jadi bagaimana menjaga semuanya tetap cepat dan efisien tanpa mengorbankan fungsionalitas?
Jangan membuat beberapa panggilan saat Anda bisa melakukannya sekaligus
Kami akan berbicara sedikit tentang fungsi yang tersedia untuk membuatnya lebih mudah, tetapi pertama-tama mari kita jelaskan mengapa demikian. Alasan yang jelas adalah bahwa panggilan tersebut relatif mahal, sehingga membuat lebih sedikit panggilan secara alami akan meningkatkan kinerja. Kedua, jika Anda dapat mengelompokkan panggilan Anda (lebih lanjut tentang pengelompokan sebentar lagi), itu berarti Anda cenderung menyisipkan pembacaan dan penulisan (mendapat dan menyetel)

Mengapa set interleaving dan menjadi sangat buruk? . Kemungkinannya adalah jika Anda membaca (mendapatkan) satu sel maka kemungkinan besar Anda akan membaca sel lain di dekat Anda, relatif segera. Demikian juga, jika Anda menulis (mengatur) satu sel maka Anda juga akan segera menulis sel lainnya. Pikirkan tentang loop apa pun dalam kode Anda - Anda dapat mengulangi baris spreadsheet, atau kolom misalnya, dan cache akan sangat membantu Anda di sini

Setiap kali Anda membaca, pertama-tama kita harus mengosongkan (melakukan) cache tulis untuk memastikan bahwa Anda membaca data terbaru (Anda dapat memaksa penulisan cache dengan memanggil (SpreadsheetApp.flush();). Begitu juga setiap kali melakukan write, kita harus membuang read cache karena sudah tidak valid lagi. Oleh karena itu, jika Anda dapat menghindari menyisipkan baca dan tulis, Anda akan mendapatkan manfaat penuh dari cache.

Kami telah menjelaskan bahwa layanan panggilan itu mahal, dan Anda dapat memperoleh manfaat maksimal dari cache dengan mengelompokkan baca dan tulis. Langkah logis selanjutnya adalah menggunakan operasi batch di Spreadsheet API. Sebagian besar fungsi atur dan dapatkan memiliki versi 'batch', misalnya ada pasangan getValue/setValue, dan ada pasangan getValues/setValues ​​yang sesuai

Fungsi batch ini beroperasi pada rentang sel sekaligus, dan Anda hanya membayar biaya satu panggilan layanan meskipun ada lebih banyak data yang ditransfer. Selain itu, dengan mengatur kode Anda untuk memaksimalkan penggunaan fungsi batch, Anda juga menghindari pembacaan dan penulisan yang diselingi yang dapat merusak kinerja cache - kemenangan ganda yang langka

Untuk mengilustrasikan manfaat setter batch dibandingkan mengoperasikan sel demi sel, mari kita ambil contoh skrip nyata. Kami telah memilih skrip galeri "Spreadsheet Fractal Art" sebagai kandidat pengoptimalan kami, tetapi teknik yang sama dapat diterapkan pada sebagian besar skrip. Skrip khusus ini mengatur warna latar belakang setiap sel dalam kisi 100x100, sehingga sangat cocok untuk penulisan batch - inilah loop asli yang menulis warna ke lembar

var sel sheet. getRange('a1');
for (var 0100y++{
  xcoord xmin;
  for (var 0x < 100x++{
    var getColor_(xcoordycoord);
    cell.offset(yx . ).setBackgroundColor(c); .
    xcoord += xincrement;
  }
  ycoord -= yincrement;
  SpreadsheetApp.siram();
}


Anda dapat melihat bahwa kami mengulang lebih dari 100 baris dan 100 kolom, menulis warna sel di setiap lokasi dengan total 10.000 panggilan ke spreadsheet. Cache tulis kembali kami sedikit membantu - sebenarnya kami memaksa menulis kembali menggunakan flush di akhir setiap baris, jadi sebenarnya hanya ada 100 panggilan ke spreadsheet karena caching yang baik. Dalam pengujian kasar kami, memanggil 'plot' seperti yang tertulis membutuhkan waktu sekitar 1 menit 10 detik

Kita dapat menulis ulang kode untuk menggunakan versi batch dari setBackgroundColor

var sel sheet. getRange('a1');
var colors new Array(100);
for (var 0y < 100y++{
  xcoord xmin;
  colors[ynew Array(100);
  for (var 0x < 100x++{
    colors[y][xgetColor_(xcoordycoord);
    xcoord += xincrement;
  }
  ycoord -= yincrement;
}
sheet.getRange(11 . 100100).setBackgroundColors(warna);


Dalam pengujian kasar kami, yang satu ini bekerja sekitar 1 detik. Pengatur waktu tidak cukup akurat untuk memberi tahu kami apakah ini 100x penuh lebih cepat, tetapi meskipun hanya peningkatan 60x, ini masih merupakan manfaat besar yang diperoleh hanya dengan memanfaatkan kekuatan sistem

Jika Anda memiliki kiat pengoptimalan kinerja yang hebat, atau kode yang berjalan sangat lambat, sebaiknya Anda memposting di forum dukungan Apps Script -- and we'll feature some of the best tips in a future post.

Diposting oleh. Evin Levey, Manajer Produk Skrip Google Apps



Catatan. kami membuat sedikit modifikasi pada skrip "Spreadsheet Fractal Art" untuk membuat contoh ini lebih mudah diikuti. Skrip yang diterbitkan menggunakan panggilan setBackgroundRGB, bukan setBackgroundColor yang Anda lihat di atas - sehingga fungsi getColor_ diubah sebagai berikut

Bagaimana cara membuat skrip aplikasi saya berjalan lebih cepat?

Gunakan operasi batch . Untuk mempercepat skrip, baca semua data ke dalam larik dengan satu perintah, lakukan operasi apa pun pada data dalam larik, dan tulis data dengan satu perintah.

Mengapa skrip Google Apps sangat lambat?

Jika kode di App Script sering berinteraksi dengan aplikasi google saat menjalankan kode (seperti sering menulis bolak-balik ke spreadsheet google), dalam kasus seperti itu, kode .

Bagaimana cara mendapatkan nama sheet aktif di Google Sheets?

Untuk mendapatkan nama sheet yang sedang aktif, pertama-tama kita harus mendapatkan referensi ke spreadsheet. Lalu kita menggunakan metode getActiveSheet() dari objek Spreadsheet untuk mendapatkan sheet yang aktif. Akhirnya, kita menggunakan metode getName() dari objek Sheet untuk mendapatkan namanya .

Bagaimana cara membuka skrip aplikasi lembar Google?

Klik Ekstensi > Skrip Aplikasi untuk membuka editor skrip, lalu salin teks skrip dari spreadsheet asli dan tempelkan ke editor skrip spreadsheet lain.