Перебирая набор значений листа Google - PullRequest
0 голосов
/ 24 октября 2018

У меня есть 2 набора данных.Один из них - это названия резервуаров

Tank Name  
  A1
  A2
  B1
  B2

, а следующий - данные ВКЛ / ВЫКЛ

ON/OFF
  0
  1
  1
  1
  1
  1
  0
  0
  1
  1
  1
  1
  1
  1
  1
  0
  0
  1
  1
  1
  0
  1
  1 

Теперь я получаю следующий результат: когда ВКЛ / ВЫКЛ равен 1, тогда первый резервуарчтобы быть упомянутым: когда это 0, ни один танк не будет упомянут.После того, как все танки упомянуты, он должен снова начаться с первого танка, то есть A1. Но если между ними встанет 0, тогда он должен начаться снова с A1 .. вот так

Result expected
 0  
 1  A1
 1  A2
 1  B1
 1  B2
 1  A1
 0  
 0  
 1  A1
 1  A2
 1  B1
 1  B2
 1  A1
 1  A2
 1  B1
 0  
 0  
 1  A1
 1  A2
 1  B1
 0  
 1  A1
 1  A2

Вы можете проверить Googleлист здесь: Сценарий 2 https://docs.google.com/spreadsheets/d/1SP2SfA-bzzhHgfrvpyUIkeQfUykata0oHxyD-x69yxE/edit?usp=sharing

Надеюсь получить помощь, чтобы решить эту проблему.Спасибо

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Это проще всего сделать с помощью вспомогательного столбца

=if(B4=1,if(B3=0,0,mod(E3+1,4)),"")

, начиная с E4, затем

=if(E4<>"",index(A$4:A$7,E4+1),"")

, начиная с F4.

Вот один из способов сделать этоэто с одной формулой, не являющейся массивом:

=IF(B4=1,INDEX(A$4:A$7,MOD(SUM(B4:INDEX(B:B,MAX(INDEX(IF(B$4:B4=0,ROW(B$4:B4)),0)),0))-1,4)+1),"")

в (скажем) G4 и опущен вниз.

NB оба они предполагают, что последовательность в столбце B начинается с нуля и будетнужна корректировка, если это не так.

Возможна также формула массива:

=ArrayFormula(if(B4:B=1,vlookup(mod(sumif(row(B4:B),"<="&row(B4:B),B4:B)-sumif(row(B4:B),"<="&vlookup(row(B4:B),if(B4:B=0,row(B4:B)),1),B4:B)-1,4)+4,{row(4:7),A4:A7},2,false),""))

enter image description here

РЕДАКТИРОВАТЬ

Вероятно, самый простой способ заставить его работать, когда первая строка включенных / выключенных данных содержит 1, состоит в том, чтобы включить строку заголовка в столбец B и использовать n (), чтобы рассматривать его как ноль, так чтоформула вспомогательного столбца -

=if(B4=1,if(n(B3)=0,0,mod(E3+1,4)),"")

, а формула без массива -

=IF(B4=1,INDEX(A$4:A$7,MOD(SUM(B4:INDEX(B:B,MAX(INDEX(IF(n(B$3:B4)=0,ROW(B$3:B4)),0)),0))-1,4)+1),"")

Формула массива работает без каких-либо изменений.Это произошло по случайной причине: второй Vlookup завершится неудачно с # N / A, если в столбце B перед текущей строкой нет нулей, а когда он передан в Sumif, вы получите нулевой результат, который вам нужен.

enter image description here

0 голосов
/ 24 октября 2018

Редактировать

Решение с одной формулой:

=FILTER(IF(B1:B=0,"",VLOOKUP(IFERROR(VLOOKUP(SUMIF(ROW(B1:B),"<="&ROW(B1:B),B1:B),{ROW(INDIRECT("a1:a"&COUNTIF(B:B,1))) , TRANSPOSE(SPLIT(TEXTJOIN("",1,TRANSPOSE(TEXT(ROW(INDIRECT("a1:a"&MAX(LEN(SPLIT(TEXTJOIN("",1,B1:B),"0")))))*(LEN(SPLIT(TEXTJOIN("",1,B1:B),"0"))>=ROW(INDIRECT("a1:a"&MAX(LEN(SPLIT(TEXTJOIN("",1,B1:B),"0")))))),"0"","";;"))),",")) },2,),0),{row(INDIRECT("a1:a"&COUNTIF(B1:B,1))) , VLOOKUP(MOD(ROW( INDIRECT("a1:a"&COUNTIF(B1:B,1)) )-1,COUNTA(A1:A))+1,{ROW(A1:A)-row(A1)+1,A1:A},2,)},2,)),B1:B<>"")

Это будут две формулы.

# 1 в C1.Для кумулятивной суммы с циклом:

=Filter(IFERROR(VLOOKUP(SUMIF(ROW(B1:B),"<="&ROW(B1:B),B1:B),{ROW(INDIRECT("a1:a"&COUNTIF(B:B,1))) , TRANSPOSE(SPLIT(TEXTJOIN("",1,TRANSPOSE(TEXT(ROW(INDIRECT("a1:a"&MAX(LEN(SPLIT(TEXTJOIN("",1,B1:B),"0")))))*(LEN(SPLIT(TEXTJOIN("",1,B1:B),"0"))>=ROW(INDIRECT("a1:a"&MAX(LEN(SPLIT(TEXTJOIN("",1,B1:B),"0")))))), "0"","";;"))),",")) },2,),0),B1:B<>"")

# 2 в D1.Для результата:

=FILTER(IF(B1:B=0,"",VLOOKUP(C1:C,{row(INDIRECT("a1:a"&COUNTIF(B1:B,1))) , VLOOKUP(MOD(ROW( INDIRECT("a1:a"&COUNTIF(B1:B,1)) )-1,COUNTA(A1:A))+1,{ROW(A1:A)-row(A1)+1,A1:A},2,)},2,)),B1:B<>"")

enter image description here

Рекомендации:

  1. Счетчики Лаборатория
  2. Лаборатория формул массива
...