Абсолютная справка с UDF и фильтрация данных в скрипте Google листов - PullRequest
1 голос
/ 15 апреля 2020

Привет, я начинающий в сценариях, вот код и googlesheet для справки

Что я получаю enter image description here что я хочу достичь enter image description here /** *@param quest1 Question of the note *@param quest1 Answer of the note *@customfunction*/ function DMNOTE(quest1,ans1,quest2,ans2,quest3,ans3,) { var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var result = quest1+'-'+ans1+','+quest2+'-'+ans2+','+quest3+'-'+ans3; return result; }

Я хочу получить абсолютную ссылку для параметра "квест", и я хочу, чтобы оно равнялось l oop для остальных столбцов до столбца, где я ввожу функцию. Также в столбце «Формула обязательна» я поместил форму для справки. Вот как я хочу, чтобы мой UDF работал.

Свернувшись, мне нужно отфильтровать «Незапрашиваемое соглашение» и оставить только «Нет» под ним и Копировать Вставьте все столбцы, выделенные синим цветом, чтобы обновить вкладку.

function toFilter (){
// filter and retain "no" in non-solicit agreement
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Worksheet");
ss.getRange(1,1,ss.getLastRow(),ss.getLastColumn());
var createfilter = SpreadsheetApp.newFilterCriteria().setHiddenValues("Yes").build();
ss.getFilter().setColumnFilterCriteria(8, createfilter);
}

Надеюсь, у меня есть смысл. Любая помощь оценивается

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Как filter "non-solicit agreement" and take only data which has "no"

Код, который вы предоставили, уже очень близок к тому, что вы хотите, вам просто нужно внести следующие корректировки:

  • setHiddenValues() ожидать массив, без строки, поэтому изменение "Yes" на ["Yes"]
  • getFilter() работает только для изменения фильтра, который уже присутствует на листе, в случае его отсутствия лучше удалить старый фильтр и создайте новый:
function toFilter(){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Worksheet");
  ss.getRange(1,1,ss.getLastRow(),ss.getLastColumn());
  var createfilter = SpreadsheetApp.newFilterCriteria().setHiddenValues(["Yes"]).build();
  if(ss.getFilter() != null) {
    ss.getFilter().remove();
  }
  ss.getDataRange().createFilter().setColumnFilterCriteria(8, createfilter);
}

Как Copy & Paste all columns highlited in blue to update tab

Создать функцию, которая

  • вызывает toFilter()
  • проверяет все строки либо они скрыты
  • копирует не скрытые строки в массив
  • вставляет этот массив на лист Update
function copyIfNotHidden(){
  toFilter();
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = spreadsheet.getSheetByName("Worksheet");
  var sheet2 = spreadsheet.getSheetByName("Update");
  var data = sheet1.getDataRange().getValues();
  var array = [];
  for (var i = 0; i < data.length; i++){
    if(sheet1.isRowHiddenByFilter(i+1)==false){
      array.push(data[i]);
    }
  }
  sheet2.getRange(sheet2.getLastRow()+1, 1, array.length, array[0].length).setValues(array);
}
1 голос
/ 15 апреля 2020

Для работы с любым количеством аргументов в вашем скрипте может быть функция, подобная приведенной ниже.

function DMNOTE(...arg){
   let result = ''
   for(let i=0;i<arg.length;i++){
     result += `${arg[i]}-${arg[i+1]},`
     i++;
   }
   return result.substring(0, result.length - 1); 
}

. Затем, сформировав электронную таблицу, вы можете вызвать ее как =DMNOTE(A$1,A2,B$1,B2,C$1,C2) или =DMNOTE(A$1,A2,B$1,B2,C$1,C2,D$1,D2). все передаваемые аргументы и возвращает результат.

...