Làm cách nào để lưu các biến tạm thời trong công thức Google Sheets?


19

Tôi đang cố gắng tạo một công thức trong bảng tính Google giống như thế này:

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

Nó có nghĩa là nếu xnhỏ hơn 0, trả lại x + 1, trả lại khác x.

Tuy nhiên, xbản thân nó là một biểu thức, ví dụ A1 + B1. Vì vậy, tôi đã kết thúc với:

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

Làm thế nào tôi có thể lưu biểu thức (A1 + B1)vào một biến tạm thời xđể tôi có thể làm điều này? :

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

Biểu thức hiện tại trong bảng tính của tôi trông như thế này:

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

Tôi đang cố gắng để làm cho nó trông ngắn hơn và dễ quản lý hơn như thế này:

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, các biến là một phần và phần của công thức. Việc hack các ô như các biến tạm thời cảm thấy giống như một giải pháp bẩn vì các ô có nghĩa là để lưu trữ dữ liệu kinh doanh , không phải ram.
Pacerier

1
@pnuts, Không quan trọng là nó được lưu trữ ở đâu miễn là nó không được lưu trữ trong các tế bào. Các tế bào có nghĩa là để lưu trữ dữ liệu kinh doanh .
Pacerier

1
@pnuts, Một giải pháp tập lệnh sẽ là giải pháp thay thế tốt nhất tiếp theo. Miễn là dữ liệu không xuất hiện trong một tế bào, đó là một giải pháp khả thi.
Pacerier

Câu trả lời:


6

Tôi thường kết thúc việc sử dụng các ô làm biến cho các tính toán thường được sử dụng và trên thực tế, đặt tên cho chúng bằng cách sử dụng "phạm vi được đặt tên". Nó làm cho nó dễ dàng hơn để suy nghĩ về công thức bạn đang cố gắng phát triển. Bạn có thể ẩn các ô đó, nếu bạn không muốn nhìn thấy chúng.


Sẽ coi đây là giải pháp được lựa chọn cho đến khi một giải pháp tốt hơn xuất hiện.
Pacerier

4

Câu trả lời ngắn

Tại thời điểm này, Google Sheets không có tính năng gán tên cho biến được xác định bởi công thức thay vì tham chiếu ô hoặc phạm vi. Để sử dụng một công thức với các loại biến này, phương án thay thế là sử dụng các hàm tùy chỉnh.

Các chức năng tùy chỉnh trong Google Sheets

Các chức năng tùy chỉnh được xác định trong các dự án ràng buộc của Google Apps Script hoặc các tiện ích bổ sung của Google Sheets. Chúng chỉ có thể được sử dụng để trả về các giá trị, không tự động hóa các tác vụ như gửi email.

Hàm tùy chỉnh giống như hàm JavaScript và có thể sử dụng JSDOC để thêm các tính năng tích hợp sẵn như tự động hoàn thành và để hiển thị trình trợ giúp công thức bật lên. Ngoài ra một thông báo lỗi tùy chỉnh có thể được bao gồm.

Trong trường hợp được trình bày trong câu hỏi, cấu trúc mong muốn của công thức được hiển thị trong một ô nên có cấu trúc như sau

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

nơi xcó thể là một chức năng tùy chỉnh.

Sau đây là một ví dụ đơn giản về chức năng tùy chỉnh sử dụng 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();
}

Công thức sử dụng hàm tùy chỉnh ở trên với cấu trúc được chỉ định trong câu hỏi sẽ nhìn theo cách sau

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

row() có thể được sử dụng thay cho hằng số để nhập vào hàng nơi đặt công thức.

Để "mô phỏng" công thức rõ ràng được trình bày trong câu hỏi, các công thức tích hợp nên được thay thế bằng các hàm Script của JavasScript / Google Apps.

Tài liệu tham khảo


Có thể xác định các chức năng tùy chỉnh bằng cách sử dụng các chức năng của Google Sheet (thay vì của JS) không? Tôi không tìm thấy bất cứ điều gì theo hướng này vì vậy tôi nghi ngờ nó.
hiểu

@anderpered: Tại thời điểm này, điều đó là không thể. Xem stackoverflow.com/questions/3686061/ từ
Rubén

3

Tôi đang thực hiện một số nỗ lực này (tôi đồng ý rằng đây sẽ là một tính năng rất hữu ích, đặc biệt là đối với các công thức dài. Đây là những gì tôi đã viết cho đến nay:

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

Về mặt lý thuyết, điều này sẽ hữu ích cho việc đơn giản hóa một công thức ô phức tạp như:

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

vào đây:

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

Bổ sung D_VAR#'sVAR#'scó thể được viết vào tập lệnh để cho phép khai báo nhiều biến và gọi khi cần.

Tuy nhiên, dường như D_VAR0không lưu trữ đúng biến được bao bọc vào mảng biến [].

Nếu tôi nhập thủ công một phần tử trong mảng, VAR0 có thể truy cập nó và đưa nó trở lại ô hiện hoạt. Ví dụ:

var variables = ["test"];

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

Điều này để lại cho tôi hai câu hỏi. Nếu sau đây là có thể, thì tôi nghĩ có thể khai báo và gọi các biến tạm thời thông qua một hàm tùy chỉnh:

  1. Nếu các chức năng tùy chỉnh có thể truy cập các phần tử mảng, chúng cũng có thể lưu trữ các phần tử vào một mảng không? Nếu vậy thì thế nào?

  2. Nếu các hàm tùy chỉnh có thể lưu trữ các phần tử vào một mảng, chúng chỉ có thể truy cập được trong cùng một công thức liền kề trong cùng một ô? Hoặc có thể truy cập cùng một biến được lưu trữ trong một ô khác không? Thí dụ:

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.