Halaman ini mencakup berbagai praktik terbaik untuk mengembangkan dengan skrip Google Ads.
Pemilih
Memfilter dengan pemilih
Jika memungkinkan, gunakan filter untuk meminta hanya entity yang Anda butuhkan. Menerapkan filter yang tepat memiliki manfaat berikut:
- Kodenya lebih sederhana dan mudah dipahami.
- Skrip akan dijalankan jauh lebih cepat.
Bandingkan cuplikan kode berikut:
Pendekatan coding | Cuplikan kode |
---|---|
Memfilter menggunakan pemilih (direkomendasikan) |
var keywords = AdsApp.keywords() .withCondition('Clicks > 10') .forDateRange('LAST_MONTH') .get(); while (keywords.hasNext()) { var keyword = keywords.next(); // Do work here. } |
Filter dalam kode (tidak direkomendasikan) |
var keywords = AdsApp.keywords().get(); while (keywords.hasNext()) { var keyword = keywords.next(); var stats = keyword.getStatsFor( 'LAST_MONTH'); if (stats.getClicks() > 10) { // Do work here. } } |
Pendekatan kedua tidak direkomendasikan karena mencoba mengambil daftar semua kata kunci di akun Anda hanya untuk menerapkan filter ke daftar tersebut.
Menghindari penelusuran hierarki kampanye
Jika Anda ingin mengambil entity pada tingkat tertentu, gunakan metode koleksi pada tingkat tersebut, bukan menjelajahi seluruh hierarki kampanye. Selain lebih sederhana, cara ini juga akan berperforma jauh lebih baik: sistem tidak perlu membaca semua kampanye dan grup iklan secara tidak perlu.
Bandingkan cuplikan kode berikut yang mengambil semua iklan di akun Anda:
Pendekatan coding | Cuplikan kode |
---|---|
Gunakan metode pengumpulan yang sesuai (Direkomendasikan) |
var ads = AdsApp.ads(); |
Menjelajahi hierarki (Tidak direkomendasikan) |
var campaigns = AdsApp.campaigns().get(); while (campaigns.hasNext()) { var adGroups = campaigns.next(). adGroups().get(); while (adGroups.hasNext()) { var ads = adGroups.next().ads().get(); // Do your work here. } } |
Pendekatan kedua tidak direkomendasikan karena mencoba mengambil seluruh hierarki objek (kampanye, grup iklan), padahal hanya iklan yang diperlukan.
Menggunakan metode pengakses induk tertentu
Terkadang Anda perlu mendapatkan entity induk objek yang diambil. Dalam hal ini, Anda harus menggunakan metode pengakses yang disediakan, bukan mengambil seluruh hierarki.
Bandingkan cuplikan kode berikut yang mengambil grup iklan yang memiliki iklan teks dengan lebih dari 50 klik bulan lalu:
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan metode pengakses induk yang sesuai (direkomendasikan) |
var ads = AdsApp.ads() .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); while (ads.hasNext()) { var ad = ads.next(); var adGroup = ad.getAdGroup(); var campaign = ad.getCampaign(); // Store (campaign, adGroup) to an array. } |
Menjelajahi hierarki (tidak direkomendasikan) |
var campaigns = AdsApp.campaigns().get(); while (campaigns.hasNext()) { var adGroups = campaigns.next() .adGroups() .get(); while (adGroups.hasNext()) { var ads = adGroups.ads() .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); if (ads.totalNumEntities() > 0) { // Store (campaign, adGroup) to an array. } } } |
Pendekatan kedua tidak direkomendasikan karena mengambil seluruh hierarki kampanye dan grup iklan di akun Anda, padahal Anda hanya memerlukan subkumpulan kampanye dan grup iklan yang terkait dengan kumpulan iklan Anda. Pendekatan pertama membatasi dirinya untuk mengambil hanya kumpulan iklan yang relevan, dan menggunakan metode yang sesuai untuk mengakses objek induknya.
Menggunakan filter induk tertentu
Untuk mengakses entitas dalam kampanye atau grup iklan tertentu, gunakan filter tertentu di pemilih, bukan mengambil lalu menjelajahi hierarki.
Bandingkan cuplikan kode berikut yang mengambil daftar iklan teks dalam kampanye dan grup iklan tertentu yang memiliki lebih dari 50 klik bulan lalu.
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan filter tingkat induk yang sesuai (direkomendasikan) |
var ads = AdsApp.ads() .withCondition('CampaignName = "Campaign 1"') .withCondition('AdGroupName = "AdGroup 1"') .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); while (ads.hasNext()) { var ad = ads.next(); var adGroup = ad.getAdGroup(); var campaign = ad.getCampaign(); // Store (campaign, adGroup, ad) to // an array. } |
Menjelajahi hierarki (tidak direkomendasikan) |
var campaigns = AdsApp.campaigns() .withCondition('Name = "Campaign 1"') .get(); while (campaigns.hasNext()) { var adGroups = campaigns.next() .adGroups() .withCondition('Name = "AdGroup 1"') .get(); while (adGroups.hasNext()) { var ads = adGroups.ads() .withCondition('Clicks > 50') .forDateRange('LAST_MONTH') .get(); while (ads.hasNext()) { var ad = ads.next(); // Store (campaign, adGroup, ad) to // an array. } } } |
Pendekatan kedua tidak direkomendasikan karena melakukan iterasi pada hierarki kampanye dan grup iklan di akun Anda, padahal Anda hanya memerlukan sekumpulan iklan yang dipilih, serta kampanye dan grup iklan induknya. Pendekatan pertama membatasi iterasi ke daftar iklan dengan menerapkan filter tertentu untuk entitas induk pada pemilih.
Gunakan ID untuk memfilter jika memungkinkan
Saat memfilter entity, sebaiknya filter entity menurut ID-nya, bukan menurut kolom lain.
Pertimbangkan cuplikan kode berikut yang memilih kampanye.
Pendekatan coding | Cuplikan kode |
---|---|
Filter menurut ID (direkomendasikan) |
var campaign = AdsApp.campaigns() .withIds([12345]) .get() .next(); |
Filter menurut Nama (kurang optimal) |
var campaign = AdsApp.campaigns() .withCondition('Name="foo"') .get() .next(); |
Pendekatan kedua kurang optimal karena kita memfilter menurut kolom non-ID.
Filter menurut ID induk jika memungkinkan
Saat memilih entitas, filter menurut ID induk jika memungkinkan. Tindakan ini akan mempercepat kueri Anda dengan membatasi daftar entity yang diambil oleh server saat memfilter hasil.
Pertimbangkan cuplikan kode berikut yang mengambil AdGroup berdasarkan ID-nya. Asumsikan bahwa ID kampanye induk diketahui.
Pendekatan coding | Cuplikan kode |
---|---|
Memfilter menurut ID kampanye dan grup iklan (direkomendasikan) |
var adGroup = AdsApp.adGroups() .withIds([12345]) .withCondition('CampaignId="54678"') .get() .next(); |
Memfilter hanya menurut ID grup iklan (kurang optimal) |
var adGroup = AdsApp.adGroups() .withIds([12345]) .get() .next(); |
Meskipun kedua cuplikan kode memberikan hasil yang identik, pemfilteran
tambahan dalam cuplikan kode 1 menggunakan ID induk (CampaignId="54678")
membuat
kode lebih efisien dengan membatasi daftar entitas yang harus diiterasi
server saat memfilter hasil.
Gunakan label jika ada terlalu banyak kondisi pemfilteran
Jika Anda memiliki terlalu banyak kondisi pemfilteran, sebaiknya buat label untuk entitas yang Anda proses, dan gunakan label tersebut untuk memfilter entitas Anda.
Pertimbangkan cuplikan kode berikut yang mengambil daftar kampanye berdasarkan namanya.
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan label (direkomendasikan) |
var label = AdsApp.labels() .withCondition('Name = "My Label"') .get() .next(); var campaigns = label.campaigns.get(); while (campaigns.hasNext()) { var campaign = campaigns.next(); // Do more work } |
Buat pemilih kompleks (tidak direkomendasikan) |
var campaignNames = [‘foo’, ‘bar’, ‘baz’]; for (var i = 0; i < campaignNames.length; i++) { campaignNames[i] = '"' + campaignNames[i] + '"'; } var campaigns = AdsApp.campaigns .withCondition('CampaignName in [' + campaignNames.join(',') + ']') .get(); while (campaigns.hasNext()) { var campaign = campaigns.next(); // Do more work. } |
Meskipun kedua cuplikan kode memberikan tingkat performa yang serupa, pendekatan kedua cenderung menghasilkan kode yang lebih kompleks seiring bertambahnya jumlah kondisi dalam pemilih Anda. Menerapkan label ke entitas baru juga lebih mudah daripada mengedit skrip untuk menyertakan entitas baru.
Membatasi jumlah kondisi dalam klausa IN
Saat menjalankan skrip, kasus penggunaan umum adalah menjalankan laporan untuk daftar entitas. Developer biasanya melakukannya dengan membuat kueri AWQL yang sangat panjang yang memfilter ID entitas menggunakan klausa IN. Pendekatan ini berfungsi dengan baik jika jumlah entitas terbatas. Namun, seiring bertambahnya panjang kueri, performa skrip Anda akan menurun karena dua alasan:
- Kueri yang lebih panjang memerlukan waktu lebih lama untuk diuraikan.
- Setiap ID yang Anda tambahkan ke klausa IN adalah kondisi tambahan yang harus dievaluasi, dan oleh karena itu, akan memakan waktu lebih lama.
Dalam kondisi seperti itu, sebaiknya terapkan label ke entity, lalu filter menurut LabelId
.
Pendekatan coding | Cuplikan kode |
---|---|
Menerapkan label dan memfilter menurut labelID (direkomendasikan) |
// The label applied to the entity is "Report Entities" var label = AdsApp.labels() .withCondition('LabelName contains "Report Entities"') .get() .next(); var report = AdsApp.report('SELECT AdGroupId, Id, Clicks, ' + 'Impressions, Cost FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE LabelId = "' + label.getId() + '"'); |
Membangun kueri panjang menggunakan klausa IN (tidak direkomendasikan) |
var report = AdsApp.report('SELECT AdGroupId, Id, Clicks, ' + 'Impressions, Cost FROM KEYWORDS_PERFORMANCE_REPORT WHERE ' + 'AdGroupId IN (123, 456) and Id in (123,345, 456…)'); |
Pemberitahuan akun
Perubahan batch
Saat Anda membuat perubahan pada entitas Google Ads, skrip Google Ads tidak akan langsung menjalankan perubahan tersebut. Sebagai gantinya, perubahan ini mencoba menggabungkan beberapa perubahan ke dalam batch, sehingga dapat mengeluarkan satu permintaan yang melakukan beberapa perubahan. Pendekatan ini membuat skrip Anda lebih cepat dan mengurangi beban pada server Google Ads. Namun, ada beberapa pola kode yang memaksa skrip Google Ads untuk sering menghapus batch operasinya, sehingga menyebabkan skrip Anda berjalan lambat.
Pertimbangkan skrip berikut yang memperbarui bid daftar kata kunci.
Pendekatan coding | Cuplikan kode |
---|---|
Melacak elemen yang diperbarui (direkomendasikan) |
var keywords = AdsApp.keywords() .withCondition('Clicks > 50') .withCondition('CampaignName = "Campaign 1"') .withCondition('AdGroupName = "AdGroup 1"') .forDateRange('LAST_MONTH') .get(); var list = []; while (keywords.hasNext()) { var keyword = keywords.next(); keyword.bidding().setCpc(1.5); list.push(keyword); } for (var i = 0; i < list.length; i++) { var keyword = list[i]; Logger.log('%s, %s', keyword.getText(), keyword.bidding().getCpc()); } |
Mengambil elemen yang diperbarui dalam loop ketat (tidak direkomendasikan) |
var keywords = AdsApp.keywords() .withCondition('Clicks > 50') .withCondition('CampaignName = "Campaign 1"') .withCondition('AdGroupName = "AdGroup 1"') .forDateRange('LAST_MONTH') .get(); while (keywords.hasNext()) { var keyword = keywords.next(); keyword.bidding().setCpc(1.5); Logger.log('%s, %s', keyword.getText(), keyword.bidding().getCpc()); } |
Pendekatan kedua tidak direkomendasikan karena panggilan ke
keyword.bidding().getCpc()
memaksa skrip Google Ads untuk menghapus setCpc()
operasi dan hanya menjalankan satu operasi dalam satu waktu. Pendekatan pertama, meskipun
mirip dengan pendekatan kedua, memiliki manfaat tambahan berupa dukungan batching
karena panggilan getCpc()
dilakukan dalam loop terpisah dari loop tempat
setCpc()
dipanggil.
Gunakan builder jika memungkinkan
Skrip Google Ads mendukung dua cara untuk membuat objek baru—pembangun dan metode pembuatan. Builder lebih fleksibel daripada metode pembuatan, karena memberi Anda akses ke objek yang dibuat dari panggilan API.
Pertimbangkan cuplikan kode berikut:
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan builder (direkomendasikan) |
var operation = adGroup.newKeywordBuilder() .withText('shoes') .build(); var keyword = operation.getResult(); |
Menggunakan metode pembuatan (tidak direkomendasikan) |
adGroup.createKeyword('shoes'); var keyword = adGroup.keywords() .withCondition('KeywordText="shoes"') .get() .next(); |
Pendekatan kedua tidak disarankan karena operasi pemilihan tambahan yang terlibat dalam pengambilan kata kunci. Selain itu, metode pembuatan juga tidak digunakan lagi.
Namun, perlu diingat bahwa builder, jika digunakan secara tidak benar, dapat mencegah skrip Google Ads mengelompokkan operasinya.
Pertimbangkan cuplikan kode berikut yang membuat daftar kata kunci, dan mencetak ID kata kunci yang baru dibuat:
Pendekatan coding | Cuplikan kode |
---|---|
Melacak elemen yang diperbarui (direkomendasikan) |
var keywords = [‘foo’, ‘bar’, ‘baz’]; var list = []; for (var i = 0; i < keywords.length; i++) { var operation = adGroup.newKeywordBuilder() .withText(keywords[i]) .build(); list.push(operation); } for (var i = 0; i < list.length; i++) { var operation = list[i]; var result = operation.getResult(); Logger.log('%s %s', result.getId(), result.getText()); } |
Mengambil elemen yang diperbarui dalam loop tertutup (tidak direkomendasikan) |
var keywords = [‘foo’, ‘bar’, ‘baz’]; for (var i = 0; i < keywords.length; i++) { var operation = adGroup.newKeywordBuilder() .withText(keywords[i]) .build(); var result = operation.getResult(); Logger.log('%s %s', result.getId(), result.getText()); } |
Pendekatan kedua tidak disarankan karena memanggil operation.getResult()
dalam loop yang sama yang membuat operasi, sehingga memaksa skrip Google Ads
untuk menjalankan satu operasi dalam satu waktu. Pendekatan pertama, meskipun serupa, memungkinkan
batching karena kita memanggil operation.getResult() dalam loop yang berbeda dengan tempat
dibuatnya.
Pertimbangkan penggunaan upload massal untuk update besar
Tugas umum yang dilakukan developer adalah menjalankan laporan dan memperbarui properti entitas (misalnya, bid kata kunci) berdasarkan nilai performa saat ini. Jika
Anda harus memperbarui sejumlah besar entity, upload massal cenderung memberikan
performa yang lebih baik. Misalnya, pertimbangkan skrip berikut yang meningkatkan
MaxCpc kata kunci yang TopImpressionPercentage > 0.4
-nya untuk bulan lalu:
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan upload massal (direkomendasikan) |
var report = AdsApp.report( 'SELECT AdGroupId, Id, CpcBid FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE TopImpressionPercentage > 0.4 DURING LAST_MONTH'); var upload = AdsApp.bulkUploads().newCsvUpload([ report.getColumnHeader('AdGroupId').getBulkUploadColumnName(), report.getColumnHeader('Id').getBulkUploadColumnName(), report.getColumnHeader('CpcBid').getBulkUploadColumnName()]); upload.forCampaignManagement(); var reportRows = report.rows(); while (reportRows.hasNext()) { var row = reportRows.next(); row['CpcBid'] = row['CpcBid'] + 0.02; upload.append(row.formatForUpload()); } upload.apply(); |
Memilih dan memperbarui kata kunci menurut ID (kurang optimal) |
var reportRows = AdsApp.report('SELECT AdGroupId, Id, CpcBid FROM ' + 'KEYWORDS_PERFORMANCE_REPORT WHERE TopImpressionPercentage > 0.4 ' + ' DURING LAST_MONTH') .rows(); var map = { }; while (reportRows.hasNext()) { var row = reportRows.next(); var adGroupId = row['AdGroupId']; var id = row['Id']; if (map[adGroupId] == null) { map[adGroupId] = []; } map[adGroupId].push([adGroupId, id]); } for (var key in map) { var keywords = AdsApp.keywords() .withCondition('AdGroupId="' + key + '"') .withIds(map[key]) .get(); while (keywords.hasNext()) { var keyword = keywords.next(); keyword.bidding().setCpc(keyword.bidding().getCpc() + 0.02); } } |
Meskipun pendekatan kedua memberikan performa yang cukup baik, pendekatan pertama lebih disukai dalam kasus ini karena
Skrip Google Ads memiliki batasan jumlah objek yang dapat diambil atau diperbarui dalam satu kali proses, dan operasi pemilihan serta pembaruan dalam pendekatan kedua dihitung dalam batas tersebut.
Upload massal memiliki batas yang lebih tinggi, baik dalam hal jumlah entitas yang dapat diperbarui, maupun waktu eksekusi keseluruhan.
Mengelompokkan upload massal menurut kampanye
Saat membuat upload massal, coba kelompokkan operasi menurut kampanye induk. Hal ini meningkatkan efisiensi dan mengurangi kemungkinan terjadinya konflik perubahan / error serentak.
Pertimbangkan dua tugas upload massal yang berjalan secara paralel. Yang satu menjeda iklan dalam grup iklan; yang lain menyesuaikan bid kata kunci. Meskipun tidak terkait, operasi dapat berlaku untuk entity dalam grup iklan yang sama (atau dua grup iklan berbeda dalam kampanye yang sama). Jika hal ini terjadi, sistem akan mengunci entitas induk (grup iklan atau kampanye bersama), sehingga menyebabkan tugas upload massal saling memblokir.
Skrip Google Ads dapat mengoptimalkan eksekusi dalam satu tugas upload massal, jadi hal paling sederhana yang dapat dilakukan adalah menjalankan hanya satu tugas upload massal per akun dalam satu waktu. Jika Anda memutuskan untuk menjalankan lebih dari satu upload massal per akun, pastikan upload massal beroperasi pada daftar kampanye yang saling eksklusif (dan entitas turunannya) untuk performa yang optimal.
Pelaporan
Menggunakan laporan untuk mengambil statistik
Jika Anda ingin mengambil sejumlah besar entitas dan statistiknya, sebaiknya gunakan laporan, bukan metode AdsApp standar. Penggunaan laporan lebih disarankan karena alasan berikut:
- Laporan memberikan performa yang lebih baik untuk kueri besar.
- Laporan tidak akan mencapai kuota pengambilan normal.
Bandingkan cuplikan kode berikut yang mengambil Klik, Tayangan, Biaya, dan Teks semua kata kunci yang menerima lebih dari 50 klik bulan lalu:
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan laporan (direkomendasikan) |
report = AdsApp.search( 'SELECT ' + ' ad_group_criterion.keyword.text, ' + ' metrics.clicks, ' + ' metrics.cost_micros, ' + ' metrics.impressions ' + 'FROM ' + ' keyword_view ' + 'WHERE ' + ' segments.date DURING LAST_MONTH ' + ' AND metrics.clicks > 50'); while (report.hasNext()) { var row = report.next(); Logger.log('Keyword: %s Impressions: %s ' + 'Clicks: %s Cost: %s', row.adGroupCriterion.keyword.text, row.metrics.impressions, row.metrics.clicks, row.metrics.cost); } |
Menggunakan iterator AdsApp (tidak direkomendasikan) |
var keywords = AdsApp.keywords() .withCondition('metrics.clicks > 50') .forDateRange('LAST_MONTH') .get(); while (keywords.hasNext()) { var keyword = keywords.next(); var stats = keyword.getStatsFor('LAST_MONTH'); Logger.log('Keyword: %s Impressions: %s ' + 'Clicks: %s Cost: %s', keyword.getText(), stats.getImpressions(), stats.getClicks(), stats.getCost()); } |
Pendekatan kedua tidak disarankan karena melakukan iterasi pada kata kunci
dan mengambil statistik satu entity dalam satu waktu. Laporan berjalan lebih cepat dalam kasus ini karena mengambil semua data dalam satu panggilan dan melakukan streaming sesuai kebutuhan. Selain itu, kata kunci yang diambil dalam pendekatan kedua dihitung dalam kuota skrip Anda untuk jumlah entitas yang diambil menggunakan panggilan get()
.
Menggunakan penelusuran, bukan laporan
Metode laporan dibuat untuk infrastruktur lama, dan akan menghasilkan output dalam format datar meskipun Anda menggunakan GAQL. Artinya, hasil kueri harus diubah agar sesuai dengan gaya lama, yang tidak didukung untuk semua kolom dan menambah overhead pada setiap panggilan.
Sebaiknya gunakan penelusuran untuk memanfaatkan semua fitur pelaporan Google Ads API baru.
Lebih memilih GAQL daripada AWQL
Meskipun AWQL masih didukung dalam kueri laporan dan panggilan withCondition
, AWQL dijalankan melalui lapisan terjemahan yang tidak memiliki kompatibilitas penuh dengan AWQL yang sebenarnya. Untuk memiliki kontrol penuh atas kueri, pastikan Anda menggunakan GAQL.
Jika Anda memiliki kueri AWQL yang ingin diterjemahkan, kami memiliki Alat Migrasi Kueri untuk membantu.
Jangan memilih lebih banyak baris daripada yang Anda butuhkan
Kecepatan eksekusi laporan (dan pemilih) didasarkan pada jumlah total baris yang akan ditampilkan oleh laporan, terlepas dari apakah Anda melakukan iterasi di dalamnya. Artinya, Anda harus selalu menggunakan filter tertentu untuk meminimalkan kumpulan hasil sebanyak mungkin agar sesuai dengan kasus penggunaan Anda.
Misalnya, Anda ingin menemukan grup iklan dengan bid di luar rentang tertentu. Akan lebih cepat membuat dua kueri terpisah, satu untuk bid di bawah nilai minimum dan satu lagi untuk bid di atas nilai maksimum, daripada mengambil semua grup iklan dan mengabaikan grup iklan yang tidak Anda minati.
Pendekatan coding | Cuplikan kode |
---|---|
Menggunakan dua kueri (direkomendasikan) |
var adGroups = [] var report = AdsApp.search( 'SELECT ad_group.name, ad_group.cpc_bid_micros' + ' FROM ad_group WHERE ad_group.cpc_bid_micros < 1000000'); while (report.hasNext()) { var row = report.next(); adGroups.push(row.adGroup); } var report = AdsApp.search( 'SELECT ad_group.name, ad_group.cpc_bid_micros' + ' FROM ad_group WHERE ad_group.cpc_bid_micros > 2000000'); while (report.hasNext()) { var row = report.next(); adGroups.push(row.adGroup); } |
Mempersempit dari kueri umum (tidak direkomendasikan) |
var adGroups = [] var report = AdsApp.search( 'SELECT ad_group.name, ad_group.cpc_bid_micros' + ' FROM ad_group'); while (report.hasNext()) { var row = report.next(); var cpcBidMicros = row.adGroup.cpcBidMicros; if (cpcBidMicros < 1000000 || cpcBidMicros > 2000000) { adGroups.push(row.adGroup); } } |
Skrip Pengelola Iklan (MCC)
Lebih memilih executeInParallel daripada eksekusi serial
Saat menulis skrip untuk akun pengelola, gunakan executeInParallel()
, bukan eksekusi serial, jika memungkinkan. executeInParallel()
memberi skrip Anda lebih banyak
waktu pemrosesan (hingga satu jam) dan hingga 30 menit per akun yang diproses
(bukan 30 menit gabungan untuk eksekusi serial). Lihat halaman batas kami untuk mengetahui detail selengkapnya.
Spreadsheet
Menggunakan operasi batch saat memperbarui spreadsheet
Saat memperbarui spreadsheet, coba gunakan metode operasi massal (misalnya, getRange()
) daripada metode yang memperbarui satu sel dalam satu waktu.
Pertimbangkan cuplikan kode berikut yang menghasilkan pola fraktal pada spreadsheet.
Pendekatan coding | Cuplikan kode |
---|---|
Memperbarui rentang sel dalam satu panggilan (direkomendasikan) |
var colors = new Array(100); for (var y = 0; y < 100; y++) { xcoord = xmin; colors[y] = new Array(100); for (var x = 0; x < 100; x++) { colors[y][x] = getColor_(xcoord, ycoord); xcoord += xincrement; } ycoord -= yincrement; } sheet.getRange(1, 1, 100, 100).setBackgroundColors(colors); |
Memperbarui satu sel dalam satu waktu (tidak direkomendasikan) |
var cell = sheet.getRange('a1'); for (var y = 0; y < 100; y++) { xcoord = xmin; for (var x = 0; x < 100; x++) { var c = getColor_(xcoord, ycoord); cell.offset(y, x).setBackgroundColor(c); xcoord += xincrement; } ycoord -= yincrement; SpreadsheetApp.flush(); } |
Meskipun Google Spreadsheet mencoba mengoptimalkan cuplikan kode kedua dengan menyimpan nilai dalam cache, performanya tetap buruk dibandingkan dengan cuplikan pertama, karena jumlah panggilan API yang dilakukan.