Сценарий Google App - замените формулу статическими значениями, если условие выполнено - PullRequest
0 голосов
/ 14 июня 2019

Попытка придумать скрипт приложения Google, который заменяет выходные данные формул статическими значениями за предыдущие недели.

Вот образец Google Sheet https://docs.google.com/spreadsheets/d/1GaqGBG4YcSihlP10weIr7tnGGgNSvf9XcftEoYeS4DY/edit#gid=0

В таблице есть лист «Отчет», который обновляется один раз в неделю (новые данные перезаписываются), и ячейка B3 получает общее количество хитомеров из этого отчета. Таблица «Сводка», где строка B29: BA29 - календарные недели. Ячейка B5 - текущий номер CW для отчета. Строка B32: BA32 содержит еженедельные данные о количестве клиентов, которых следует выбрать из отчета.

Поскольку Report постоянно обновляется, хотелось бы жестко закодировать результаты формул за последние недели.

Пробовал с петлей и без нее. Пробовал getValues, Logger, setValues. Также попробовал copyValuesToRange. Либо ничего не заменяется, либо все недели получают статические значения, даже будущие.

function freeze() {

var sss = SpreadsheetApp.openById('XXX').getSheetByName('Summary');

var cw = sss.getRange('B5').getValue;//current week

var weeks = sss.getRange('B29:BA29').getValues(); // all weeks

    for (var i=0; i<weeks.length; i++) {
    // alternatively tried this loop 
    //  for (var i=0; i<weeks[0].length; i=i+1)

         if (weeks < cw) 

      {  var dered = sss.getRange(32,2,1,27);

         dered.copyValuesToRange(sss,2,27,32,32);

}}}

или другой код

function freeze() {

var sss = SpreadsheetApp.openById('XXX');

var cw = sss.getSheetByName('Summary').getRange('B5').getValue;

var weeks = sss.getSheetByName('Summary').getRange('B29:BA29').getValues(); 

 var dered = sss.getSheetByName('Summary').getRange('B32:BA32');

 var deredvalues = dered.getValues();

      if (weeks < cw) {

  var deredsum = msred.setValues(deredvalues);

} }

или как это

 function freeze() {

  var sss = SpreadsheetApp.openById('XXX');

  var cw = sss.getSheetByName('Summary').getRange('B5').getValue;

  var weeks = sss.getSheetByName('Summary').getRange('B29:BA29').getValues(); 

  var dered = sss.getSheetByName('Summary').getRange('B32:BA32');

    if (weeks < cw) {

   var deredvalues = dered.getValues();

     Logger.log(deredvalues)

        dered.setValues(deredvalues);

  } }

Либо ничего не заменено, либо все недели получают статические значения, даже будущие. Буду благодарен за идеи.

1 Ответ

0 голосов
/ 26 июня 2019

Процедура, которую вы должны выполнить для реализации желаемой функциональности:

  1. Отметьте в листе Summary, ячейка B5 какая календарная неделя это
  2. Найти столбец, назначенный соответствующей календарной неделе
  3. Получить значения из ячеек B2 и B3 из листов Us Category1 и Category2
  4. Вставить значения в соответствующие строки на листе Summary - в столбец, соответствующий текущей календарной неделе

Вот как это может выглядеть, основываясь на файле скрипта, привязанном к таблице, которую вы добавили в комментариях:

function logUS() {

  var ss = SpreadsheetApp.openById('1Vy1k_ejwxA4DJPqo_Pa0b5kXSkvE44MHRPR3lNF3wCw');
  var country = "US";
  var summary=ss.getSheetByName('Summary');
  var cw = summary.getRange('B5').getValue();
  var cat1 = ss.getSheetByName('US Category1').getRange('B2').getValue();
  var cat1cancel = ss.getSheetByName('US Category1').getRange('B3').getValue();
  var cat2 = ss.getSheetByName('US Category2').getRange('B2').getValue();
  var cat2cancel = ss.getSheetByName('US Category2').getRange('B3').getValue();

  var ts = ss.getSheetByName('CopyValues').appendRow([country+cw,cw,cat1,cat2,cat1cancel,cat2cancel]); 
  var columnNumbers=summary.getLastColumn()-1; 
  var weekRange=summary.getRange(31,2, 1, columnNumbers);
  for(i=0;i<columnNumbers; i++)
   {
    if(summary.getRange(31,(2+i)).getValue()==cw)
       {
       summary.getRange(33,(2+i)).setValue(cat1);
       summary.getRange(34,(2+i)).setValue(cat2);
       summary.getRange(36,(2+i)).setValue(cat1cancel);
       summary.getRange(37,(2+i)).setValue(cat2cancel);
      }   
   } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...