一旦满足条件,如何锁定输出单元格的结果,以防止 Google 工作表中输入单元格的后续值更改?
How to lock the result of the output cell, once it meets a criteria, from subsequent value change in the input cell in Google Sheets?
我想解决这个问题:
根据 B1(输入单元格)中的值(随时间变化),在输出单元格 (D1) 中打印特定的 "status"。
有 3 种可能的状态:
第一名:"VALID"
第二名:"PENDING"
第三名:"APPROVED"
具有 3 个主要属性:
A1 = 固定值(不随时间变化)
B1 = 值随时间变化
C1 = 字符串"APPROVED"(需手动输入)
D1 = 输出单元格
按照这个公式:
=IFS(len(C1),"APPROVED",B1>A1,"VALID",B1<=A1,"PENDING",TRUE,"ERROR")
我想做的是:
一旦 B1>A1("VALID" 状态)变为 B1<=A1("PENDING" 状态),将 D1 单元格状态 "PENDING" 锁定为 "PENDING".
IE。不恢复为 "VALID" if/when B1<=A1 变回 B1>A1。
此外,如果状态 "APPROVED" (len(C1)-手动输入字符串 "APPROVED" 的条件,则仅将 "PENDING" 状态解锁为 "APPROVED" 状态进入C1)随后遇到。
这里有一个预期结果的简单例子:
在 T1(例如,2019 年 5 月 27 日,12:15pm):
B1>A1 -> 状态=有效
A1 = 1.2(在A1中,固定数)
B1 = 1.5(在 B1 中,数字随时间变化)
C1 =(空单元格)
D1 = 有效
在 T2(例如,2019 年 5 月 27 日,1:15pm):
B1<=A1 -> 状态=待处理
A1 = 1.2(比如 2019 年 5 月 27 日,12:15pm)
B1 = 1.2(或 1.1)(在 B1 中,数字随时间变化)
C1 =(空单元格)
D1 = 待定
在 T3(例如,2019 年 5 月 27 日,2:15pm):
B1>A1 -> Status= PENDING(尽管 B1 恢复为 B1>A1,但没有恢复为 VALID)
A1 = 1.2(在A1中,固定数)
B1 = 1.4(在B1中,数字随时间变化)
C1 =(空单元格)
D1 = 待定
在 T4(例如,2019 年 5 月 27 日,3:15pm):
A1 = 1.2(在A1中,固定数)
B1 = 1.4 或 1.1(在 B1 中,数字随时间变化)
D1 = APPROVED(因为手动输入任何字符到 C1)
C1 = (C1 中任意长度的字符)
(用户在 C1 中手动输入任何 character/string -> Status= APPROVED(由于 len(C1),PENDING 状态被解锁为 APPROVED 状态)
T3 是我目前面临的问题。
用这个公式:
=IFS(len(C1),"APPROVED",B1>A1,"VALID",B1<=A1,"PENDING",TRUE,"ERROR")
"PENDING"状态(从T2获得)恢复到"VALID"
B1>A1("VALID"状态)变为B1<=A1("PENDING"状态)如何锁定"PENDING"状态?
然后在D1手动输入"APPROVED"字符串时解锁"PENDING"状态?
新问题:
我们也可以对状态进行着色和粗体编码吗?
例如:
下面 sheet 中的单元格 A22 到 A25。
Sheet 这里:
https://docs.google.com/spreadsheets/d/1UjjMnLmNbEDUfXjeCIOgBZwYqTeXdm_t_4N45OL0k6I/edit#gid=0
非常感谢您的帮助!
到目前为止,我已经完成了。
经过一些研究,我了解了如何使用基本的应用程序脚本自定义函数,成功地重现了如下的 if 语句。
但我仍然看不到如何在 B1<=A1 参数验证后存储 "PENDING" 状态。照原样,当 B1 值变回 B1>A1.
时,下面的脚本会恢复到 "VALID" 状态
如何在应用脚本中制定这个缺失的存储参数?
/**
* Stores Status 'PENDING' As soon as B1>A1 changes to B1<=A1
*
* @param arg1: The "PENDING" status that will be stored as soon as B1>A1 changes to B1<=A1
* @customfunction
*/
function STATUSPENDING(arg1) {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
var fixedvalueCell = activeSheet.getRange(1, 1).getValue();
var changingvalueCell = activeSheet.getRange(1, 2).getValue();
var statusCell = activeSheet.getRange(1, 4).getValue();
if(changingvalueCell <= fixedvalueCell) {
activeSheet.getRange(1, 4).setValue("PENDING");
} else {
activeSheet.getRange(1, 4).setValue("VALID");
}
var result = arg1;
return result;
}
关于在向 C1 中键入任何字符长度时启用状态从 "PENDING" 更改为 "APPROVED" 的第二个参数,我添加了 IFS 函数 len(C1) 等效应用程序脚本:
/**
* Stores Status 'PENDING' As soon as B1>A1 changes to B1<=A1
*
* @param arg1: The "PENDING" status that will be stored as soon as B1>A1 changes to B1<=A1
* Unlocks 'PENDING' status to 'APPROVED" status when manual typing in C1
*
* @customfunction
*/
//The 'approveCell !== ""' status changes the 'PENDING' status to
//"APPROVED' in D1 when manually typing in C1
function STATUSPENDING(arg1) {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
var fixedvalueCell = activeSheet.getRange(1, 1).getValue();
var changingvalueCell = activeSheet.getRange(1, 2).getValue();
var approveCell = activeSheet.getRange(1, 3).getValue();
var statusCell = activeSheet.getRange(1, 4).getValue();
if
(approveCell !== "") {
activeSheet.getRange(1, 4).setValue("APPROVED");
}
else if
(changingvalueCell <= fixedvalueCell) {
activeSheet.getRange(1, 4).setValue("PENDING");
}
else {
activeSheet.getRange(1, 4).setValue("VALID");
}
var result = arg1;
return result;
}
要为文本状态添加颜色和粗体,我已将 .setFontColor 和 .setFontWeight 参数添加到应用程序脚本代码中:
/**
* Colors specific words
*
* @param arg2: Colors "VALID" Status to orange, "PENDING" Status to gree, and "APPROVED" to purple
*
* @customfunction
*/
function COLORWORDS(arg2) {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
var fixedvalueCell = activeSheet.getRange(1, 1).getValue();
var changingvalueCell = activeSheet.getRange(1, 2).getValue();
var approveCell = activeSheet.getRange(1, 3).getValue();
var statusCell = activeSheet.getRange(1, 4).getValue();
if
(approveCell !== "") {
activeSheet.getRange(1, 4).setValue("APPROVED").setFontColor("#7F00FF").setFontWeight("bold");
}
else if
(changingvalueCell <= fixedvalueCell) {
activeSheet.getRange(1, 4).setValue("PENDING").setFontColor("#7FFF00").setFontWeight("bold");
}
else {
activeSheet.getRange(1, 4).setValue("VALID").setFontColor("#FF3D0D").setFontWeight("bold");
}
var result = arg2;
return result;
}
终于搞定了!
这是一个类似于IFS函数操作模式的操作优先顺序问题:
第一个操作语句:
关于 "APPROVED" 状态的第一条 If 语句作为对机器的第一条指令。
第二个操作语句:
(机器继续计算如果第一个是FALSE
)
作为机器的第 2 条操作指令,继续 "PENDING" 状态 IF 语句(常规)。
第三条操作说明:
(机器继续计算如果第一个是(仍然)FALSE
并且第二个语句是(仍然)TRUE
)
继续锁定单元格 D1 中的“"PENDING" 状态,如果单元格 D1 包含字符串 "PENDING"(继承自之前发现为 TRUE
的第二个操作语句)(statusCell = "PENDING" —> D1 = "PENDING")
第四个操作语句:
(机器继续计算的如果第一,第二/第三操作语句都不是TRUE
)
进入"VALID"状态IF语句作为机器的第4/3个操作指令。
机器推理模式:
因此,与通常的人类思维相比,机器必须以一种落后的方式继续执行其操作:首先是 APPROVED,然后是 PENDING,然后是 Lock PENDING,最后是 VALID。
编辑(2019 年 6 月 9 日):
我更正了脚本中的一些小错误:
[LOCKVALUECOLORBOLDWORDS 用于 LOCKVALUE&COLOR&BOLDWORDS,(statusCell == "PENDING") 用于 (statusCell = "PENDING"),如果 approveCell 的值为 not-blank,则注释 [1.]。 ..,对于 [1.] 如果 approveCell 的值为空...)]。
(我一定是忘记在发布之前以某种方式保存它)。
现在一切正常。
这里是Sheet:
但由于某些原因,该函数需要在每次编辑后执行两次以打印新状态。
此处为视频演示:
我会看看为什么会这样,并寻找如何弄清楚如何在单次执行后打印它。
到目前为止的新脚本:
/**
* Locks the Status of a cell according to criteria and Colors and bolds the specific words of status
*
* @param arg3: Colors "VALID" Status to orange, "PENDING" Status to green, and "APPROVED" to purple
*
* @customfunction
*/
function LOCKVALUECOLORBOLDWORDS(arg3) {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
//(read left to right) get the value from range A1:A1, from active sheet, and assign it the variable "fixedvalueCell"
var fixedvalueCell = activeSheet.getRange(1, 1).getValue();
//(read left to right) get the value from range B1:B1, from active sheet, and assign it the variable "changingvalueCell"
var changingvalueCell = activeSheet.getRange(1, 2).getValue();
//(read left to right) get the value from range C1:C1, from active sheet, and assign it the variable "approveCell"
var approveCell = activeSheet.getRange(1, 3).getValue();
//(read left to right) get the value from range D1:D1, from active sheet, and assign it the variable "statusCell"
var statusCell = activeSheet.getRange(1, 4).getValue();
//[1.] if the value of approveCell is not-blank, then set/print "APPROVED" into D1, and color it to purple, and bold it.
if
(approveCell !== "") {
activeSheet.getRange(1, 4).setValue("APPROVED").setFontColor("#7F00FF").setFontWeight("bold");
}
//[2.] if the value of changingvalueCell is smaller or equal to the value of fixedvalueCell, then set/print "PENDING" into D1, and color it to green, and bold it.
else if
(changingvalueCell <= fixedvalueCell) {
activeSheet.getRange(1, 4).setValue("PENDING").setFontColor("#7FFF00").setFontWeight("bold");
}
//[3.] if the value of statusCell is "PENDING", then set/print "PENDING" into D1, and color it to green, and bold it.
else if
(statusCell == "PENDING") {
activeSheet.getRange(1, 4).setValue("PENDING").setFontColor("#7FFF00").setFontWeight("bold");
}
//[4.] if all [1.] and [2.] and [3.] IF statements are FALSE (for everything else), then set/print "VALID" into D1, and color it to orange, and bold it.
else {
activeSheet.getRange(1, 4).setValue("VALID").setFontColor("#FF6600").setFontWeight("bold");
}
var result = arg3;
return result;
}
我想解决这个问题:
根据 B1(输入单元格)中的值(随时间变化),在输出单元格 (D1) 中打印特定的 "status"。
有 3 种可能的状态:
第一名:"VALID"
第二名:"PENDING"
第三名:"APPROVED"
具有 3 个主要属性:
A1 = 固定值(不随时间变化)
B1 = 值随时间变化
C1 = 字符串"APPROVED"(需手动输入)
D1 = 输出单元格
按照这个公式:
=IFS(len(C1),"APPROVED",B1>A1,"VALID",B1<=A1,"PENDING",TRUE,"ERROR")
我想做的是:
一旦 B1>A1("VALID" 状态)变为 B1<=A1("PENDING" 状态),将 D1 单元格状态 "PENDING" 锁定为 "PENDING". IE。不恢复为 "VALID" if/when B1<=A1 变回 B1>A1。
此外,如果状态 "APPROVED" (len(C1)-手动输入字符串 "APPROVED" 的条件,则仅将 "PENDING" 状态解锁为 "APPROVED" 状态进入C1)随后遇到。
这里有一个预期结果的简单例子:
在 T1(例如,2019 年 5 月 27 日,12:15pm):
B1>A1 -> 状态=有效
A1 = 1.2(在A1中,固定数)
B1 = 1.5(在 B1 中,数字随时间变化)
C1 =(空单元格)
D1 = 有效
在 T2(例如,2019 年 5 月 27 日,1:15pm):
B1<=A1 -> 状态=待处理
A1 = 1.2(比如 2019 年 5 月 27 日,12:15pm)
B1 = 1.2(或 1.1)(在 B1 中,数字随时间变化)
C1 =(空单元格)
D1 = 待定
在 T3(例如,2019 年 5 月 27 日,2:15pm):
B1>A1 -> Status= PENDING(尽管 B1 恢复为 B1>A1,但没有恢复为 VALID)
A1 = 1.2(在A1中,固定数)
B1 = 1.4(在B1中,数字随时间变化)
C1 =(空单元格)
D1 = 待定
在 T4(例如,2019 年 5 月 27 日,3:15pm):
A1 = 1.2(在A1中,固定数)
B1 = 1.4 或 1.1(在 B1 中,数字随时间变化)
D1 = APPROVED(因为手动输入任何字符到 C1)
C1 = (C1 中任意长度的字符)
(用户在 C1 中手动输入任何 character/string -> Status= APPROVED(由于 len(C1),PENDING 状态被解锁为 APPROVED 状态)
T3 是我目前面临的问题。
用这个公式:
=IFS(len(C1),"APPROVED",B1>A1,"VALID",B1<=A1,"PENDING",TRUE,"ERROR")
"PENDING"状态(从T2获得)恢复到"VALID"
B1>A1("VALID"状态)变为B1<=A1("PENDING"状态)如何锁定"PENDING"状态?
然后在D1手动输入"APPROVED"字符串时解锁"PENDING"状态?
新问题: 我们也可以对状态进行着色和粗体编码吗?
例如:
下面 sheet 中的单元格 A22 到 A25。
Sheet 这里:
https://docs.google.com/spreadsheets/d/1UjjMnLmNbEDUfXjeCIOgBZwYqTeXdm_t_4N45OL0k6I/edit#gid=0
非常感谢您的帮助!
到目前为止,我已经完成了。
经过一些研究,我了解了如何使用基本的应用程序脚本自定义函数,成功地重现了如下的 if 语句。 但我仍然看不到如何在 B1<=A1 参数验证后存储 "PENDING" 状态。照原样,当 B1 值变回 B1>A1.
时,下面的脚本会恢复到 "VALID" 状态如何在应用脚本中制定这个缺失的存储参数?
/**
* Stores Status 'PENDING' As soon as B1>A1 changes to B1<=A1
*
* @param arg1: The "PENDING" status that will be stored as soon as B1>A1 changes to B1<=A1
* @customfunction
*/
function STATUSPENDING(arg1) {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
var fixedvalueCell = activeSheet.getRange(1, 1).getValue();
var changingvalueCell = activeSheet.getRange(1, 2).getValue();
var statusCell = activeSheet.getRange(1, 4).getValue();
if(changingvalueCell <= fixedvalueCell) {
activeSheet.getRange(1, 4).setValue("PENDING");
} else {
activeSheet.getRange(1, 4).setValue("VALID");
}
var result = arg1;
return result;
}
关于在向 C1 中键入任何字符长度时启用状态从 "PENDING" 更改为 "APPROVED" 的第二个参数,我添加了 IFS 函数 len(C1) 等效应用程序脚本:
/**
* Stores Status 'PENDING' As soon as B1>A1 changes to B1<=A1
*
* @param arg1: The "PENDING" status that will be stored as soon as B1>A1 changes to B1<=A1
* Unlocks 'PENDING' status to 'APPROVED" status when manual typing in C1
*
* @customfunction
*/
//The 'approveCell !== ""' status changes the 'PENDING' status to
//"APPROVED' in D1 when manually typing in C1
function STATUSPENDING(arg1) {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
var fixedvalueCell = activeSheet.getRange(1, 1).getValue();
var changingvalueCell = activeSheet.getRange(1, 2).getValue();
var approveCell = activeSheet.getRange(1, 3).getValue();
var statusCell = activeSheet.getRange(1, 4).getValue();
if
(approveCell !== "") {
activeSheet.getRange(1, 4).setValue("APPROVED");
}
else if
(changingvalueCell <= fixedvalueCell) {
activeSheet.getRange(1, 4).setValue("PENDING");
}
else {
activeSheet.getRange(1, 4).setValue("VALID");
}
var result = arg1;
return result;
}
要为文本状态添加颜色和粗体,我已将 .setFontColor 和 .setFontWeight 参数添加到应用程序脚本代码中:
/**
* Colors specific words
*
* @param arg2: Colors "VALID" Status to orange, "PENDING" Status to gree, and "APPROVED" to purple
*
* @customfunction
*/
function COLORWORDS(arg2) {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
var fixedvalueCell = activeSheet.getRange(1, 1).getValue();
var changingvalueCell = activeSheet.getRange(1, 2).getValue();
var approveCell = activeSheet.getRange(1, 3).getValue();
var statusCell = activeSheet.getRange(1, 4).getValue();
if
(approveCell !== "") {
activeSheet.getRange(1, 4).setValue("APPROVED").setFontColor("#7F00FF").setFontWeight("bold");
}
else if
(changingvalueCell <= fixedvalueCell) {
activeSheet.getRange(1, 4).setValue("PENDING").setFontColor("#7FFF00").setFontWeight("bold");
}
else {
activeSheet.getRange(1, 4).setValue("VALID").setFontColor("#FF3D0D").setFontWeight("bold");
}
var result = arg2;
return result;
}
终于搞定了!
这是一个类似于IFS函数操作模式的操作优先顺序问题:
第一个操作语句:
关于 "APPROVED" 状态的第一条 If 语句作为对机器的第一条指令。
第二个操作语句:
(机器继续计算如果第一个是FALSE
)
作为机器的第 2 条操作指令,继续 "PENDING" 状态 IF 语句(常规)。
第三条操作说明:
(机器继续计算如果第一个是(仍然)FALSE
并且第二个语句是(仍然)TRUE
)
继续锁定单元格 D1 中的“"PENDING" 状态,如果单元格 D1 包含字符串 "PENDING"(继承自之前发现为 TRUE
的第二个操作语句)(statusCell = "PENDING" —> D1 = "PENDING")
第四个操作语句:
(机器继续计算的如果第一,第二/第三操作语句都不是TRUE
)
进入"VALID"状态IF语句作为机器的第4/3个操作指令。
机器推理模式:
因此,与通常的人类思维相比,机器必须以一种落后的方式继续执行其操作:首先是 APPROVED,然后是 PENDING,然后是 Lock PENDING,最后是 VALID。
编辑(2019 年 6 月 9 日):
我更正了脚本中的一些小错误:
[LOCKVALUECOLORBOLDWORDS 用于 LOCKVALUE&COLOR&BOLDWORDS,(statusCell == "PENDING") 用于 (statusCell = "PENDING"),如果 approveCell 的值为 not-blank,则注释 [1.]。 ..,对于 [1.] 如果 approveCell 的值为空...)]。 (我一定是忘记在发布之前以某种方式保存它)。
现在一切正常。
这里是Sheet:
但由于某些原因,该函数需要在每次编辑后执行两次以打印新状态。
此处为视频演示:
我会看看为什么会这样,并寻找如何弄清楚如何在单次执行后打印它。
到目前为止的新脚本:
/**
* Locks the Status of a cell according to criteria and Colors and bolds the specific words of status
*
* @param arg3: Colors "VALID" Status to orange, "PENDING" Status to green, and "APPROVED" to purple
*
* @customfunction
*/
function LOCKVALUECOLORBOLDWORDS(arg3) {
var app = SpreadsheetApp;
var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
//(read left to right) get the value from range A1:A1, from active sheet, and assign it the variable "fixedvalueCell"
var fixedvalueCell = activeSheet.getRange(1, 1).getValue();
//(read left to right) get the value from range B1:B1, from active sheet, and assign it the variable "changingvalueCell"
var changingvalueCell = activeSheet.getRange(1, 2).getValue();
//(read left to right) get the value from range C1:C1, from active sheet, and assign it the variable "approveCell"
var approveCell = activeSheet.getRange(1, 3).getValue();
//(read left to right) get the value from range D1:D1, from active sheet, and assign it the variable "statusCell"
var statusCell = activeSheet.getRange(1, 4).getValue();
//[1.] if the value of approveCell is not-blank, then set/print "APPROVED" into D1, and color it to purple, and bold it.
if
(approveCell !== "") {
activeSheet.getRange(1, 4).setValue("APPROVED").setFontColor("#7F00FF").setFontWeight("bold");
}
//[2.] if the value of changingvalueCell is smaller or equal to the value of fixedvalueCell, then set/print "PENDING" into D1, and color it to green, and bold it.
else if
(changingvalueCell <= fixedvalueCell) {
activeSheet.getRange(1, 4).setValue("PENDING").setFontColor("#7FFF00").setFontWeight("bold");
}
//[3.] if the value of statusCell is "PENDING", then set/print "PENDING" into D1, and color it to green, and bold it.
else if
(statusCell == "PENDING") {
activeSheet.getRange(1, 4).setValue("PENDING").setFontColor("#7FFF00").setFontWeight("bold");
}
//[4.] if all [1.] and [2.] and [3.] IF statements are FALSE (for everything else), then set/print "VALID" into D1, and color it to orange, and bold it.
else {
activeSheet.getRange(1, 4).setValue("VALID").setFontColor("#FF6600").setFontWeight("bold");
}
var result = arg3;
return result;
}