一旦满足条件,如何锁定输出单元格的结果,以防止 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 = A​​PPROVED(因为手动输入任何字符到 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:

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?

但由于某些原因,该函数需要在每次编辑后执行两次以打印新状态。

此处为视频演示:

https://youtu.be/DEI7RGRotcs

我会看看为什么会这样,并寻找如何弄清楚如何在单次执行后打印它。

到目前为止的新脚本:

https://pastebin.com/gxK0bvcu

/**
* 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;

    }