一旦满足条件,如何从Google表格中输入单元格的后续值更改中锁定输出单元格的结果?

时间:2019-05-27 09:15:58

标签: google-apps-script google-sheets google-sheets-formula

我正在解决这种情况:

根据B1(输入单元格)中随时间变化的值,在输出单元格(D1)中打印特定的“状态”。

具有3种可能的状态:

第一名:“有效”

2nd:“待处理”

第3个:“已批准”

具有3个主要属性:

A1 =固定值(不随时间变化)

B1 =值随时间变化

C1 =字符串“ APPROVED”(要手动输入)

D1 =输出单元格

遵循以下公式:

=IFS(len(C1),"APPROVED",B1>A1,"VALID",B1<=A1,"PENDING",TRUE,"ERROR")

我想做的是:

将B1> A1(“有效”状态)更改为B1 <= A1(“待处理”状态)后,将D1单元格状态“待处理”锁定为“待处理”。 即当/当B1 <= A1变回B1> A1时,不恢复为“有效”。

此外,只有在随后满足状态“已批准”(len(C1)-手动将字符串“ APPROVED”输入到C1)的条件时,才将“待定”状态解锁为“已批准”状态。

以下是预期结果的简单示例:

在T1 (例如,2019年5月27日,下午12:15):

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:15 pm)

B1 = 1.2(或1.1)(在B1中,数字随时间变化)

C1 =(空单元格)

D1 = 待审核

在T3 (例如,2019年5月27日,下午2:15):

B1> A1->状态=待处理(尽管B1恢复为B1> A1也没有恢复为有效)

A1 = 1.2(在A1中为固定数字)

B1 = 1.4 (在B1中,数字随时间变化)

C1 =(空单元格)

D1 = 待审核

在T4 (例如,2019年5月27日,下午2:15):

A1 = 1.2(在A1中为固定数字)

B1 = 1.4或1.1 (在B1中,数字随时间变化)

D1 = 已批准(因为手动将任何字符输入到C1中)

C1 = (到C1的任何字符长度)

(用户手动将任何字符/字符串输入C1-> Status = APPROVED(由于len(C1),PENDING状态被解锁为APPROVED状态)

在T3,这是我目前面临的问题。

使用以下公式:

=IFS(len(C1),"APPROVED",B1>A1,"VALID",B1<=A1,"PENDING",TRUE,"ERROR")

“待处理”状态(从T2获得)恢复为“有效”

一旦B1> A1(“有效”状态)变为B1 <= A1(“待处理”状态),如何锁定“待处理”状态?

然后在将“ APPROVED”字符串手动键入D1时解锁“ PENDING”状态吗?

新问题: 我们也可以对状态进行颜色和粗体编码吗?

例如:

下表中的单元格A22至A25。

在这里放置:

https://docs.google.com/spreadsheets/d/1UjjMnLmNbEDUfXjeCIOgBZwYqTeXdm_t_4N45OL0k6I/edit#gid=0

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

关于第二个参数,以便在将任何字符长度输入C1时启用将状态从“ PENDING”更改为“ APPROVED”,我添加了等效的IFS函数len(C1)应用程序脚本:

Loan Nego          New Maturity          Loan Amount in OCUR       New Interest 
2019-03-01         2019-03-11            1000                        0.65            
2019-03-01         2019-03-29            2000                        3.671

答案 1 :(得分:0)

要为文本状态添加颜色和粗体,我已将.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;

}

答案 2 :(得分:0)

最后把它整理好了!

这是类似于IFS功能操作模式的操作优先顺序的问题:

第一个操作语句:

关于“已批准”状态的第一条If语句作为对机器的第一条指令。

第二条操作语句:

(如果1st是FALSE,机器将继续对其进行计算)

作为对机器的第二条操作指令,进入IF语句的“ PENDING”状态(常规)。

第三条操作说明:

(如果第一个语句是(静止)FALSE,第二个语句是(静止)TRUE,机器将继续对其进行计算)

如果单元格D1包含字符串“ PENDING”(从第2个操作语句,从TRUE之前继承过来),则继续锁定单元格D1中的““ PENDING”状态(statusCell =“ PENDING” —> D1 = “正在等待”)

第四个操作语句:

(如果第一,第二/第三操作语句都不是TRUE,机器将继续对其进行计算)

作为对机器的第4/3条操作指令,进入状态IF语句“ VALID”。

机器推理模式:

因此,与通常的人类思维相比,机器必须以向后的方式继续执行其操作:首先批准,然后挂起,然后锁定挂起,最后有效。

/**
* 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 LOCKVALUE&COLOR&BOLDWORDS(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 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 everithing 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;

    }

答案 3 :(得分:-1)

到目前为止,这是我来的地方。

经过一些研究,我成功介绍了如何使用基本的应用程序脚本自定义功能,并成功地复制了if语句,如下所示。 但我仍然看不到如何通过B1 <= A1参数验证“ PENDING”状态的存储方式。照原样,当B1值恢复为B1> A1时,下面的脚本恢复为“有效”状态。

如何在应用脚本中表达这种缺失的存储参数?

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

}