Google E-Tablolar formülünde geçici değişkenler nasıl kaydedilir?


19

Şuna benzer bir Google e-tablosunda bir formül oluşturmaya çalışıyorum:

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

Bu , dönüşten başka bir dönüşten xküçükse anlamına gelir .0x + 1x

Bununla birlikte, xkendisi bir ifadedir, ör A1 + B1. Bu yüzden:

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

Bunu yapabilmem için ifadeyi (A1 + B1)geçici bir değişkene nasıl kaydedebilirim x? :

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

E-tablomdaki geçerli ifade şöyle:

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))))
)

Daha kısa ve daha yönetilebilir görünmesini sağlamaya çalışıyorum:

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
@pnuts, Hmm, değişkenler formüllerin bir parçasıdır. Hücreleri geçici değişkenler olarak kesmek, kirli bir çözüm gibi hissedilir, çünkü hücreler koç değil, verilerini depolamak içindir .
Pacerier

1
@pnuts, Hücrelerde saklanmadığı sürece nerede depolandığı önemli değildir. Hücreler, verilerini depolamak içindir .
Pacerier

1
@pnuts, Komut dosyası çözümü olası en iyi alternatif olabilir. Veriler bir hücrede görünmediği sürece geçerli bir çözümdür.
Pacerier

Yanıtlar:


6

Ben sık sık sık kullanılan hesaplamalar için değişkenler olarak hücreleri kullanarak sonuç ve aslında "adlandırılmış aralıklar" kullanarak adlandırın. Geliştirmeye çalıştığınız formül hakkında düşünmeyi kolaylaştırır. Görünmelerini istemiyorsanız, bu hücreleri gizleyebilirsiniz.


Daha iyi bir çözüm olana kadar bunu seçilen çözüm olarak alacaktır.
Pacerier

4

Kısa cevap

Şu anda, Google E-Tablolar, hücre veya aralık başvurusu yerine formülle tanımlanan bir değişkene ad atama özelliğine sahip değildir. Bu tür değişkenlerle bir formül kullanmak için alternatif özel işlevler kullanmaktır.

Google E-Tablolar'daki özel işlevler

Özel işlevler, Google Apps Komut Dosyaları ilişkili projelerde veya Google E-Tablolar eklentilerinde tanımlanır. E-posta gönderme gibi görevleri otomatikleştirmek için değil, yalnızca değer döndürmek için kullanılabilirler.

Özel bir işlev bir JavaScript işlevi gibidir ve JSDOC'u otomatik tamamlama gibi yerleşik işlev özellikleri eklemek ve açılır formül yardımcısını görüntülemek için kullanabilir. Ayrıca özel bir hata mesajı da eklenebilir.

Soruda sunulan durumda, bir hücrede gösterilecek formülün istenen yapısı aşağıdaki yapıya sahip olmalıdır

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

burada xözel bir işlev olabilir.

Aşağıda, JSDOC kullanan özel bir işlevin basit bir örneğidir .

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

Soruda belirtilen yapıya sahip yukarıdaki özel işlevi kullanan formül aşağıdaki şekilde görünecektir

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

row() formülün yerleştirildiği satıra giriş olarak sahip olmak için bir sabit yerine kullanılabilir.

Soruda sunulan açık formülü "öykünmek" için, yerleşik formüller JavasScript / Google Apps Script işlevleriyle değiştirilmelidir.

Referanslar


Google Sheet işlevlerini (JS yerine) kullanarak özel işlevler tanımlamak mümkün müdür? Bu yönde hiçbir şey bulamadım, bundan şüpheliyim.
16:15

@anderstood: Şu anda bu mümkün değil. Bkz. Stackoverflow.com/questions/3686061/…
Rubén

3

Bu konuda bazı girişimlerde bulunuyorum (özellikle uzun formüller için çok kullanışlı bir özellik olacağını kabul ediyorum. Şimdiye kadar yazdım:

//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];
}

Teorik olarak, bu, aşağıdaki gibi karmaşık bir hücre formülünü basitleştirmek için yararlı olacaktır:

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

bunun içine:

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

Ek olarak D_VAR#'sve VAR#'sgerektiğinde birden çok değişken bildirimi ve çağrısına izin vermek için komut dosyasına yazılabilir.

Ancak, D_VAR0kaydırılan değişkeni değişkenler [] dizisine düzgün şekilde saklamadığı anlaşılıyor .

Diziye bir öğeyi el ile girersem, VAR0 bu öğeye erişebilir ve etkin hücreye döndürebilir. Örneğin:

var variables = ["test"];

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

Bu bana iki soru bırakıyor. Aşağıdakiler mümkün ise, o zaman geçici değişkenleri özel bir işlevle bildirip çağırmanın mümkün olduğunu düşünüyorum:

  1. Özel işlevler dizi öğelerine erişebiliyorsa , öğeleri bir dizide de saklayabilirler mi? Öyleyse nasıl?

  2. Özel işlevler öğeleri bir diziye depolayabilirse, yalnızca aynı hücrede aynı bitişik formül içinde erişilebilirler mi? Yoksa aynı depolanmış değişkene farklı bir hücrede erişmek mümkün müdür? Misal:

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.