จะบันทึกตัวแปรชั่วคราวในสูตรของ Google ชีตได้อย่างไร


19

ฉันกำลังพยายามสร้างสูตรในสเปรดชีตของ Google ซึ่งมีลักษณะดังนี้:

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

มันหมายความว่าถ้าxมีขนาดเล็กกว่า0ผลตอบแทนผลตอบแทนอื่นx + 1x

แต่ตัวเองคือการแสดงออกเช่นx A1 + B1ดังนั้นฉันจึงลงเอยด้วย:

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

ฉันจะบันทึกนิพจน์(A1 + B1)ลงในตัวแปรชั่วคราวเพื่อxที่จะทำสิ่งนี้ได้อย่างไร? :

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

นิพจน์ปัจจุบันในสเปรดชีตของฉันมีลักษณะดังนี้:

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

ฉันพยายามทำให้มันสั้นลงและสามารถจัดการได้มากกว่านี้:

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, ตัวแปรเป็นส่วนหนึ่งและพัสดุของสูตร การแฮ็กเซลล์เนื่องจากตัวแปรชั่วคราวรู้สึกว่าเป็นวิธีที่สกปรกเพราะเซลล์มีไว้สำหรับการจัดเก็บข้อมูลทางธุรกิจไม่ใช่หน่วยความจำ
Pacerier

1
@pnuts ไม่สำคัญว่าจะเก็บไว้ที่ไหนตราบเท่าที่ไม่ได้เก็บไว้ในเซลล์ เซลล์มีความหมายสำหรับการจัดเก็บข้อมูลธุรกิจ
Pacerier

1
@pnuts โซลูชันสคริปต์น่าจะเป็นทางเลือกถัดไปที่ดีที่สุด ตราบใดที่ข้อมูลไม่ปรากฏในเซลล์มันก็เป็นทางออกที่ทำงานได้
Pacerier

คำตอบ:


6

ฉันมักจะสิ้นสุดการใช้เซลล์เป็นตัวแปรสำหรับการคำนวณที่ใช้บ่อยและในความเป็นจริงพวกเขาตั้งชื่อโดยใช้ "ช่วงที่มีชื่อ" ทำให้การคิดถึงสูตรที่คุณพยายามพัฒนาง่ายขึ้น คุณสามารถซ่อนเซลล์เหล่านั้นหากคุณไม่ต้องการให้เซลล์เหล่านั้นมองเห็น


จะใช้สิ่งนี้เป็นวิธีการแก้ปัญหาที่เลือกจนกว่าจะดีกว่ามาพร้อม
Pacerier

4

คำตอบสั้น ๆ

ในขณะนี้ Google ชีตไม่มีคุณสมบัติในการกำหนดชื่อให้กับตัวแปรที่กำหนดโดยสูตรแทนการอ้างอิงเซลล์หรือช่วง ในการใช้สูตรที่มีตัวแปรประเภทนี้ทางเลือกคือการใช้ฟังก์ชั่นที่กำหนดเอง

ฟังก์ชั่นที่กำหนดเองใน Google ชีต

ฟังก์ชั่นที่กำหนดเองถูกกำหนดไว้ในโครงการผูกพันของ Google Apps Script หรือส่วนเสริม Google ชีต สามารถใช้เพื่อส่งคืนค่าเท่านั้นไม่ใช่เพื่อทำงานอัตโนมัติเช่นส่งอีเมล

ฟังก์ชั่นที่กำหนดเองเป็นเหมือนฟังก์ชั่น JavaScript และสามารถใช้JSDOCเพื่อเพิ่มคุณสมบัติฟังก์ชั่นในตัวเช่นการเติมข้อความอัตโนมัติและเพื่อแสดงตัวช่วยสูตรป๊อปอัพ ข้อความแสดงข้อผิดพลาดที่กำหนดเองอาจรวมอยู่ด้วย

ในกรณีที่นำเสนอในคำถามโครงสร้างที่ต้องการของสูตรที่จะแสดงในเซลล์ควรมีโครงสร้างดังต่อไปนี้

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

ซึ่งxอาจเป็นฟังก์ชั่นที่กำหนดเอง

ต่อไปนี้เป็นตัวอย่างง่ายๆของฟังก์ชั่นที่กำหนดเองที่ใช้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();
}

สูตรที่ใช้ฟังก์ชั่นที่กำหนดเองด้านบนพร้อมโครงสร้างที่ระบุในคำถามจะมีลักษณะดังต่อไปนี้

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

row() สามารถใช้แทนค่าคงที่เพื่อป้อนอินพุตแถวที่วางสูตรได้

เพื่อ "เลียนแบบ" สูตรที่ชัดเจนที่แสดงในคำถามสูตรในตัวควรถูกแทนที่ด้วยฟังก์ชัน JavasScript / Google Apps Script

อ้างอิง


เป็นไปได้ไหมที่จะกำหนดฟังก์ชั่นที่กำหนดเองโดยใช้ฟังก์ชั่นของ Google ชีต (แทนที่จะเป็น JS) ฉันไม่พบสิ่งใดในทิศทางนี้ดังนั้นฉันจึงสงสัย
anderstood

@anderstood: ในเวลานี้มันเป็นไปไม่ได้ ดูstackoverflow.com/questions/3686061/…
Rubén

3

ฉันพยายามทำสิ่งนี้ (ฉันยอมรับว่ามันจะเป็นคุณสมบัติที่มีประโยชน์มากโดยเฉพาะอย่างยิ่งสำหรับสูตรยาว ๆ นี่คือสิ่งที่ฉันเขียนจนถึงตอนนี้:

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

ตามทฤษฎีแล้วสิ่งนี้จะเป็นประโยชน์ในการทำให้สูตรเซลล์ที่ซับซ้อนเช่น:

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

เป็นนี้

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

เพิ่มเติมD_VAR#'sและVAR#'sสามารถเขียนลงในสคริปต์เพื่ออนุญาตให้มีการประกาศตัวแปรหลายรายการและการโทรได้ตามต้องการ

อย่างไรก็ตามดูเหมือนว่าการD_VAR0จัดเก็บตัวแปรที่ห่อไว้ในอาร์เรย์ [] ไม่ถูกต้อง

ถ้าฉันป้อนองค์ประกอบในอาร์เรย์ด้วยตนเอง VAR0 จะสามารถเข้าถึงและกลับสู่เซลล์ที่ใช้งานได้ ตัวอย่างเช่น:

var variables = ["test"];

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

สิ่งนี้ทำให้ฉันมีสองคำถาม หากสิ่งต่อไปนี้เป็นไปได้ฉันคิดว่าเป็นไปได้ที่จะประกาศและเรียกตัวแปรชั่วคราวผ่านฟังก์ชั่นที่กำหนดเอง:

  1. หากฟังก์ชั่นที่กำหนดเองสามารถเข้าถึงองค์ประกอบอาร์เรย์พวกเขาสามารถเก็บองค์ประกอบไว้ในอาร์เรย์ได้หรือไม่? ถ้าเป็นเช่นนั้นได้อย่างไร

  2. หากฟังก์ชั่นที่กำหนดเองสามารถเก็บองค์ประกอบไว้ในอาร์เรย์พวกมันสามารถเข้าถึงได้เฉพาะภายในสูตรที่ต่อเนื่องกันในเซลล์เดียวกันหรือไม่ หรือเป็นไปได้ที่จะเข้าถึงตัวแปรที่เก็บไว้เหมือนกันในเซลล์อื่นหรือไม่? ตัวอย่าง:

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.