Как заблокировать результат выходной ячейки, если он соответствует критериям, от последующего изменения значения во входной ячейке в Google Sheets? - PullRequest
0 голосов
/ 27 мая 2019

Я ищу, чтобы решить эту ситуацию:

В зависимости от значения - переменное во времени - в B1 (входная ячейка), напечатайте определенный «статус» в выходной ячейке(D1).

С 3-мя возможными состояниями:

1-й: «VALID»

2-й: «PENDING»

3-й: «УТВЕРЖДЕНО»

с 3 основными свойствами:

A1 = фиксированное значение (не изменяется во времени)

B1 = изменение значенияво времени

C1 = строка «УТВЕРЖДЕНА» (вводится вручную)

D1 = выходная ячейка

по следующей формуле:

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

Я пытаюсь сделать следующее:

Как только B1> A1 (статус «VALID») изменится на B1 <= A1 (статус «PENDING»), иметь статус ячейки D1 ​​«В ОЖИДАНИИ», заблокированный в «ОЖИДАНИЕ».Т.е. не возвращается к «VALID», если / когда B1 <= A1 меняется на B1> A1.

Кроме того, разблокирование статуса «В ОЖИДАНИИ» только для статуса «УТВЕРЖДАЕТСЯ» только в том случае, если впоследствии будет выполнено условие для статуса «УТВЕРЖДЕН» (len (C1) - ввод строки «УТВЕРЖДЕН» вручную в C1).

Вот простой пример ожидаемого результата:

В T1 (скажем, 27 мая 2019 г., 12:15 вечера):

B1> A1 -> Status = VALID

A1 = 1,2 (в A1, фиксированное число)

B1 = 1,5 (в B1, числовая переменная во времени)

C1 = (пустая ячейка)

D1 = ДЕЙСТВИТЕЛЬНО

В T2 (скажем, 27 мая 2019 года, 1:15:00):

B1 <= A1 -> Статус = В ОЖИДАНИИ

A1 = 1,2 (скажем, 27 мая 2019 г., 12:15)

B1= 1,2 (или 1,1) (в B1, числовая переменная во времени)

C1 = (пустая ячейка)

D1 = В ОЖИДАНИИ

В T3 (скажем, 27 мая 2019 г., 14:15):

B1> A1 -> Status = В ОЖИДАНИИ (возврат в VALID невозможен, несмотря на возврат B1к B1> A1)

A1 = 1,2 (в A1, фиксированное число)

B1 = 1,4 (в B1, числовая переменная во времени)

C1 =(пустая ячейка)

D1 = В ОЖИДАНИИ

В T4 (скажем, 27 мая 2019, 15: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")

Статус «В ОЖИДАНИИ» (полученный от Т2) возвращается в «ДЕЙСТВИТЕЛЬНО»

Как можно заблокировать состояние «В ОЖИДАНИИ», как только B1> A1 (статус «VALID») изменится на B1 <= A1 (состояние «В ОЖИДАНИИ»)? </strong>

Затем разблокируйте статус «В ОЖИДАНИИ», когда строка «УТВЕРЖДЕНА» вручную введена в D1?

Новый вопрос: Можем ли мы также раскрасить и выделить жирным шрифтом статус?

Например:

Ячейки от A22 до A25 на листе ниже.

Лист здесь:

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

Спасибомного за вашу помощь!

Ответы [ 4 ]

0 голосов
/ 30 мая 2019

Наконец-то разобрались!

Это был порядок очередности операций, аналогичный режиму работы функции IFS:

1-я операция:

1-е утверждение If относительно статуса «УТВЕРЖДЕНО» в качестве 1-й инструкции для машины.

2-я операционная инструкция:

(к которому машина продолжает вычислять, если 1-е равно FALSE)

Перейдите к «IF» в статусе «IF» (обычное), как 2-я инструкция по эксплуатации к машине.

3-я инструкция по эксплуатации:

(к которой машина продолжает вычислять, если 1-й (все еще) FALSE и 2-й оператор (все еще) TRUE)

Перейдите к блокировке состояния «« ОЖИДАНИЕ »в ячейке D1, если в ячейке D1 содержится строка« ОЖИДАНИЕ »(унаследовано от 2-го оператора операции, найденного как TRUE ранее) (statusCell =" PENDING "-> D1 =" PENDING " «)

4-я операция:

(к которому машина продолжает вычислять, если ни 1, ни 2/3 операторы операций не равны TRUE)

Перейдите к оператору IF статуса «VALID» как 4-я / 3-я инструкция по эксплуатации машины.

Режим рассуждения машины:

Таким образом, машина должна приступить к выполнению своих операций в обратном направлении по сравнению с обычным человеческим мышлением: сначала УТВЕРЖДАЕТСЯ, затем ОЖИДАЕТ, ЗАКРЫВАЕТ ОЖИДАНИЕ и, наконец, ДЕЙСТВИТЕЛЬНО.

Редактировать (9 июня 2019 г.):

Я исправил несколько мелких ошибок в скрипте:

[LOCKVALUECOLORBOLDWORDS для LOCKVALUE & COLOR & BOLDWORDS, (statusCell == "PENDING") для (statusCell = "PENDING") и комментарий [1.], если значение ApproveCell не пустое ..., для [1.] если значение ApproveCell пустое ...)]. (Должно быть, я забыл как-то сохранить его перед публикацией).

Теперь он работает как положено.

Вот лист:

Как заблокировать результат выходной ячейки, если он соответствует критерию, от последующего изменения значения во входной ячейке в 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;

    }

0 голосов
/ 30 мая 2019

Что касается второго аргумента, позволяющего изменить статус с «ОЖИДАЕТ» на «УТВЕРЖДЕН» при вводе в С1 любой длины символа, я добавил эквивалент сценария приложения IFS function 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;

}
0 голосов
/ 30 мая 2019

Чтобы добавить цвета и жирность в текстовое состояние, я добавил аргументы .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;

}
0 голосов
/ 29 мая 2019

Пока вот куда я пришел.

После некоторых исследований я остановился на том, как использовать базовую пользовательскую функцию сценария приложения, преуспев в воспроизведении оператора if, как показано ниже. но я до сих пор не вижу, как сохранить состояние «ОЖИДАНИЕ», как только оно было подтверждено аргументом B1 <= A1. Таким образом, приведенный ниже сценарий возвращается в состояние «VALID», когда значение 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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...