Bagaimana cara menyimpan variabel sementara dalam rumus Google Sheets?


19

Saya mencoba membuat formula dalam spreadsheet Google yang terlihat seperti ini:

if (x < 0, x + 1, x)

Itu berarti jika xlebih kecil dari 0, kembali x + 1, lain kembali x.

Namun, xitu sendiri adalah ekspresi, misalnya A1 + B1. Jadi saya berakhir dengan:

if ((A1 + B1) < 0, (A1 + B1) + 1, (A1 + B1))

Bagaimana saya bisa menyimpan ekspresi (A1 + B1)ke dalam variabel sementara xsehingga saya bisa melakukan ini? :

x = (A1 + B1);
if (x < 0, x + 1, x);

Ekspresi saat ini di spreadsheet saya terlihat seperti ini:

if(
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    < 0,
    1 +
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    ,
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
)

Saya mencoba membuatnya terlihat lebih pendek dan lebih mudah dikelola seperti ini:

x = timevalue(Sheet1!$D10) - timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))));
if(
    x
    < 0,
    1 +
    x
    ,
    x
)

1
@ kacang, Hmm, variabel adalah bagian tak terpisahkan dari rumus. Meretas sel sebagai variabel sementara terasa seperti solusi kotor karena sel dimaksudkan untuk menyimpan data bisnis , bukan ram.
Pacerier

1
@ kacang, tidak masalah di mana itu disimpan asalkan tidak disimpan dalam sel. Sel dimaksudkan untuk menyimpan data bisnis .
Pacerier

1
@ kacang, solusi skrip akan menjadi alternatif terbaik berikutnya. Selama data tidak muncul dalam sel, itu adalah solusi yang layak.
Pacerier

Jawaban:


6

Saya sering berakhir menggunakan sel sebagai variabel untuk perhitungan yang sering digunakan, dan sebenarnya menamai mereka menggunakan "rentang bernama". Ini membuatnya lebih mudah untuk memikirkan formula yang Anda coba kembangkan. Anda dapat menyembunyikan sel-sel itu, jika Anda tidak ingin sel-sel itu terlihat.


Akan mengambil ini sebagai solusi terpilih sampai solusi yang lebih baik muncul.
Pacerier

4

Jawaban singkat

Saat ini, Google Sheets tidak memiliki fitur untuk menetapkan nama ke variabel yang ditentukan oleh rumus alih-alih referensi sel atau rentang. Untuk menggunakan rumus dengan jenis variabel ini alternatifnya adalah menggunakan fungsi kustom.

Fungsi khusus di Google Sheets

Fungsi khusus didefinisikan dalam proyek yang terikat Skrip Google Apps atau add-on Google Sheets. Mereka hanya dapat digunakan untuk mengembalikan nilai, bukan untuk mengotomatisasi tugas-tugas seperti mengirim email.

Fungsi kustom seperti fungsi JavaScript dan dapat menggunakan JSDOC untuk menambahkan fitur fungsi bawaan seperti autocomplete dan untuk menampilkan pembantu rumus popup. Juga pesan kesalahan khusus dapat dimasukkan.

Dalam kasus yang disajikan dalam pertanyaan, struktur formula yang diinginkan untuk ditampilkan dalam sel harus memiliki struktur berikut

if(x < 0, 1 + x, x)

di mana xbisa menjadi fungsi khusus.

Berikut ini adalah contoh sederhana dari fungsi kustom yang menggunakan JSDOC .

/**
* Returns the cell value of the specified row in column A of Sheet1.
* @param {number}   row_number   Input the row number.
* @return The cell value of the specified row in column A of Sheet1.       
* @customfunction
*/
function z(row_number) {
  if(typeof(row_number) != 'number') 
    throw new Error("A row number is required");
  return SpreadsheetApp
           .getActiveSheet()
           .getRange("Sheet1!A"+row_number)
           .getValue();
}

Rumus menggunakan fungsi kustom di atas dengan struktur yang ditentukan dalam pertanyaan akan terlihat dengan cara berikut

=if(z(10) < 0, 1 + z(10), z(10))

row() dapat digunakan sebagai pengganti konstanta untuk memiliki input baris tempat formula ditempatkan.

Untuk "meniru" rumus eksplisit yang disajikan dalam pertanyaan, rumus bawaan harus diganti dengan fungsi JavasScript / Google Apps Script.

Referensi


Apakah mungkin untuk mendefinisikan fungsi khusus menggunakan fungsi Google Sheet (bukan JS)? Saya tidak menemukan apa pun ke arah ini jadi saya ragu.
anderstood

@ anderstood: Saat ini tidak mungkin. Lihat stackoverflow.com/questions/3686061/...
Rubén

3

Saya berusaha melakukan ini (saya setuju itu akan menjadi fitur yang sangat berguna, terutama untuk formula panjang. Inilah yang saya tulis sejauh ini:

//array to store variables
var variables = [];

//Wrap a formula with "D_VAR0()" for later use
function D_VAR0(formula) {
  variables.push(formula);
}

//Write "VAR0" to access the 0th element of variables[] (which could be a long formula)
function VAR0() {
  return variables[0];
}

Secara teoritis, ini akan berguna untuk menyederhanakan formula sel yang kompleks seperti:

=IF((A2+B2)/B3<16, (A2+B2)/B3, ((A2+B2)/B3)*45)

dalam hal ini:

=IF(D_VAR0((A2+B2)/B3)<16, VAR0, VAR0*45)

Tambahan D_VAR#'sdan VAR#'sdapat ditulis ke dalam skrip untuk memungkinkan beberapa deklarasi variabel dan panggilan yang diperlukan.

Namun, tampaknya D_VAR0tidak menyimpan variabel yang dibungkus dengan benar ke dalam array variabel [].

Jika saya secara manual memasukkan elemen dalam array, VAR0 dapat mengaksesnya dan mengembalikannya ke sel yang aktif. Sebagai contoh:

var variables = ["test"];

//results in the active cell being set to "test"
function VAR0() {
     return variables[0];
}

Ini membuat saya dengan dua pertanyaan. Jika yang berikut ini mungkin, maka saya pikir mungkin untuk mendeklarasikan dan memanggil variabel sementara melalui fungsi khusus:

  1. Jika fungsi khusus dapat mengakses elemen array, dapatkah mereka juga menyimpan elemen ke array? Jika ya, bagaimana caranya?

  2. Jika fungsi khusus dapat menyimpan elemen ke array, apakah itu hanya dapat diakses dalam rumus yang sama di sel yang sama? Atau mungkinkah mengakses variabel tersimpan yang sama di sel yang berbeda? Contoh:

Cell A1 = D_VAR0(sum(3,5))

Cell D4 = VAR0() //would this return 8 in cell D4? It hasn't worked in my testing.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.