Saya ingin membuat fungsi yang mencakup ... sesuatu seperti:
function myFunction(range) {
var firstColumn = range.getColumn();
// loop over the range
}
Sel akan merujuknya menggunakan:
=myFunction(A1:A4)
Masalahnya adalah ketika saya mencoba melakukan ini, parameternya sepertinya hanya meneruskan nilai ke fungsi. Jadi, saya tidak bisa menggunakan salah satu metode Range seperti getColumn()
. Ketika saya mencoba melakukannya, itu memberikan kesalahan berikut:
kesalahan: TypeError: Tidak dapat menemukan fungsi getColumn di objek 1,2,3.
Bagaimana saya bisa mengirim rentang yang sebenarnya daripada hanya nilai-nilai ke salah satu fungsi kustom saya?
range
diperlakukan sebagai array 2d javascript. Anda bisa mendapatkan jumlah barisrange.length
dan jumlah kolomrange[0].length
. Jika Anda ingin mendapatkan nilai dari barisr
dan kolomc
digunakan:range[r][c]
.sumber
=myFunction(C1:F1)
maka di dalam fungsirange[0][0]
akan mengembalikan nilaiC1
,range[0][1]
akan mengembalikan nilaiD1
,range[0][2]
akan mengembalikan nilaiE1
, dll. Apakah itu jelas?=weightedAverage(B3:D3,$B$2:$D$2)
, saya ingin membuat fungsi lebih banyak bukti kesalahan dengan tidak harus mengirim argumen ke-2 (yaitu saya ingin menyebutnya sebagai=weightedAverage(B3:D3)
), dan kemudian minta kode secara otomatis tahu bahwa rentang dimulai pada B dan berakhir pada D, sehingga mendapat nilai yang sesuai dari baris ke-2. Catatan: nilai "2" dapat hardcoded, tetapi "B" tidak boleh hardcoded.B
diberikanrange
. Saya menyarankan Anda untuk membaca panduan memulai ( goo.gl/hm0xT ), jika Anda belum melakukannya, untuk mendapatkan ide tentang bagaimana Anda bisa bermain dengan rentang dan sel.Saat meneruskan
Range
ke fungsi Google spreadsheet, kerangka kerja dijalankanparamRange.getValues()
secara implisit dan fungsi Anda menerima nilai dalam Rentang sebagai array 2 dimensi dari string, angka, atau objek (sepertiDate
). TheRange
objek tidak dilewatkan ke fungsi spreadsheet kustom Anda.The
TYPEOF()
fungsi di bawah ini akan memberitahu Anda apa jenis data yang Anda terima sebagai parameter. Rumus=TYPEOF(A1:A4)
akan memanggil skrip seperti ini:
sumber
Sebagai alternatif, terinspirasi oleh komentar dari @Lipis, Anda dapat memanggil fungsi Anda dengan koordinat baris / kolom sebagai parameter tambahan:
Dalam formulir ini, rumus dapat dengan mudah disalin (atau diseret) ke sel lain, dan referensi sel / rentang akan disesuaikan secara otomatis.
Fungsi Script Anda perlu diperbarui seperti itu:
Perhatikan bahwa
getRange
fungsi mengambilstartRow
,startColumn
dan kemudian jumlah baris, dan jumlah kolom - tidak berakhir baris dan akhir kolom. Jadi, aritmatika.sumber
Ini bisa dilakukan . Orang bisa mendapatkan referensi ke rentang yang dilewati dengan menguraikan rumus dalam sel aktif, yang merupakan sel yang mengandung rumus. Ini membuat asumsi bahwa fungsi kustom digunakan sendiri, dan bukan sebagai bagian dari ekspresi yang lebih kompleks: misalnya
=myfunction(A1:C3)
, tidak=sqrt(4+myfunction(A1:C3))
.Fungsi ini mengembalikan indeks kolom pertama dari rentang yang diteruskan.
sumber
Saya telah memperluas ide bagus dalam jawaban user79865 , untuk membuatnya berfungsi untuk lebih banyak kasus dan dengan beberapa argumen diteruskan ke fungsi kustom.
Untuk menggunakannya, salin kode di bawah ini, dan kemudian dalam panggilan fungsi khusus Anda
GetParamRanges()
seperti ini, berikan nama fungsi Anda:Berikut ini contoh untuk mengembalikan warna sel:
Berikut kodenya dan beberapa penjelasan lainnya:
sumber
Saya membedakan dua fungsi khusus di Google Spreadsheet, melalui Google Apps Script:
Fungsi pertama mampu melakukan hampir semua hal. Selain memanggil layanan Spreadsheet, ia dapat memanggil GmailApp atau layanan apa pun yang disediakan oleh Google. Panggilan API akan memperlambat proses. Rentang dapat diteruskan, atau diambil melalui fungsi, untuk mengakses semua metode yang tersedia.
Fungsi kedua hanya terbatas pada "Spreadsheet". Di sini orang dapat menggunakan JavaScript untuk mengolah data. Fungsi-fungsi ini biasanya sangat cepat. Rentang yang dilewati, tidak lebih dari nilai array 2D.
Dalam pertanyaan Anda, Anda mulai dengan memanggil
.getColumn()
metode. Ini dengan jelas menunjukkan bahwa Anda memerlukan fungsi kustom tipe 1, seperti dijelaskan di atas.Lihat jawaban berikut tentang cara mengatur spreadsheet dan sheet, untuk membuat fungsi kustom.
sumber
Saya sedang mengerjakan ini beberapa bulan yang lalu dan muncul dengan kludge yang sangat sederhana: buat lembar baru dengan nama setiap sel sebagai isinya: Sel A1 bisa terlihat seperti:
Beri nama sheet "Ref". Lalu ketika Anda membutuhkan referensi ke sel sebagai string alih-alih isinya, Anda menggunakan:
Tentu saja, Anda harus memeriksa apakah fungsi tersebut dilewati string (satu sel) atau 1D atau 2D Array. Jika Anda mendapatkan sebuah array, ia akan memiliki semua alamat sel sebagai string, tetapi dari sel pertama dan lebar dan tinggi, Anda bisa mengetahui apa yang Anda butuhkan.
sumber
Saya telah mengerjakan hal ini sepanjang pagi dan melihat bukti dari apa yang dibahas di atas tanpa jawaban. Senseful dan saya sama-sama menginginkan ALAMAT dari sel yang lewat, bukan nilainya. Dan jawabannya sangat mudah. Itu tidak bisa dilakukan.
Saya menemukan beberapa solusi yang bergantung pada mencari tahu sel mana yang berisi formula. Sulit untuk mengatakan apakah ini akan membantu Senseful di atas. Jadi apa yang saya lakukan?
Kolom H adalah Sophia's (Wins - PrevWins) / (Losses - PrevLosses)
(7 - 4) / (4 - 2) = 1,5
Tapi kita tidak tahu di mana baris Sophia sebelumnya muncul.
Ini semua bisa dilakukan dengan menggunakan VLOOKUP jika Anda hard-kode A sebagai kolom nama. Setelah VLOOKUP, saya mendapatkan beberapa #NA (nama tidak ditemukan) dan # DIV0 (penyebut nol) dan membungkusnya dengan = IF (IF (...)) untuk menampilkan teks yang lebih enak dalam kondisi ini. Sekarang saya memiliki ekspresi yang sangat besar yang sulit dan tidak dapat dipertahankan. Jadi saya ingin ekspansi makro (tidak ada), atau fungsi khusus.
Tetapi ketika saya membuat Helper SubtractPrevValue (sel), ia menerima "7" bukannya B5. Tidak ada cara bawaan untuk mendapatkan sel atau objek rentang dari argumen yang diteruskan.
Jika saya membuat tangan pengguna memasukkan nama sel dalam tanda kutip ganda maka saya bisa melakukannya ... SubtractPrevValue ("B5"). Tapi itu benar-benar paha belakang copy / paste dan fitur sel relatif.
Tetapi kemudian saya menemukan solusi.
SpreadsheetApp.getActiveRange () ADALAH SEL yang berisi rumus. Hanya itu yang perlu saya ketahui. Nomor baris Fungsi berikut mengambil nomor kolom NUMERIK dan mengurangi kejadian sebelumnya di kolom itu.
Tetapi kemudian saya menemukan bahwa ini benar-benar lambat. Satu dan dua penundaan kedua saat itu menampilkan "Berpikir ..." Jadi saya kembali ke rumus lembar kerja yang tidak terbaca secara besar-besaran dan tidak dapat dipertahankan.
sumber
Alih-alih menyediakan objek "Rentang", Pengembang Google memberikan cukup banyak tipe data acak. Jadi, saya mengembangkan makro berikut untuk mencetak nilai input.
sumber
Ada kompilasi saya dari jawaban sebelumnya
Dibutuhkan formula saat ini dan memeriksa apakah itu Range.
=GFR(A1:A5;1;C1:C2;D1&D2)
kembaliUntuk komposisi lengkap, TC dapat memanggil sesuatu seperti ini
sumber
Buat fungsi dan lewati rentang sebagai argumen:
Penggunaan dalam spreadsheet:
Ini akan menunjukkan nilai sebagai
sum(A1:A10)
.sumber