научиться запускать функции - PullRequest
0 голосов
/ 14 декабря 2018

Нашел этот код очень похож на то, что я хочу сделать.Первоначальная цель постеров заключалась в том, чтобы иметь возможность искать на листе слово «Hello» и заставлять его возвращать данные для каждой строки с найденным текстом.

function testfindRow(){ ;// this function only to test the other one by giving it a parameter and using its result.
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var otherSheet=ss.getSheets()[1];// assuming there is a second sheet to copy to
    var datatocopy=findRow('Hello');
    if (datatocopy.length>0){
        otherSheet.getRange(otherSheet.getLastRow()+1,1,datatocopy.length,datatocopy[0].length).setValues(datatocopy);
    }
}
//
function findRow(item) { ;// the actual search function
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet=ss.getSheets()[0];
    var resultArray=new Array();
    var values = sheet.getDataRange().getValues();
    for(cc =0; cc < values.length; ++cc) {
        if(values[cc].toString().match(item)==item){// here you can eventually use string modifiers like toLowerCase() to allow for wider search criteria
            // or like this to search only in column D // if(values[cc][3].toString().match(item)==item){
                resultArray.push(values[cc]);
            };
        }
        Logger.log(resultArray);// the array of Rows in which the item was found,
        return resultArray ;// the returned value is a 2 dimensions array to use with setValues()

    }

}

Я планирую изменить для своего использования, но сначала удивляюсь,как заставить этот кусок кода выполняться в течение сценария?Я могу запустить testfindRow вручную, и он работает хорошо.Просто не автоматически.Мой сценарий работает до этой точки, а затем останавливается.Какой ключ к запуску этого кода будет дальше?

С ответом Купера, у меня теперь есть этот код:

function onOpen(e) {
  SpreadsheetApp.getUi()
      .createMenu('PROCESS')
      .addItem('Next Order', 'findAString')
      .addToUi();
}

function findAString(){
   var ss=SpreadsheetApp.getActive();
   var sh1=ss.getActiveSheet();
   var sh2=ss.getSheetByName('Responses');
   if(!sh2){
     ss.insertSheet('Responses');
   }
   var resp=SpreadsheetApp.getUi().prompt("Enter a String");
   var rA=findRow(resp.getResponseText());
   if (rA){
     sh2.getRange(sh2.getLastRow()+1,1,rA.length,rA[0].length).setValues(rA);
   }
 }

Я получаю пункт меню ПРОЦЕСС, подвыбор Следующий порядок и поле вводавсплывает.Можно ввести там строку и выбрать «ОК», но затем скрипт жалуется.

ReferenceError: «findRow» не определено.

Нажим вперед?

1 Ответ

0 голосов
/ 14 декабря 2018

Хорошо, на этот раз я попытался создать законченное решение, чтобы вы могли увидеть небольшой успех.У меня есть функция для создания меню и другая для создания вкладки «Результаты».Загрузите все функции в редактор сценариев и затем запустите createMenu ().После этого вы можете вернуться к просмотру электронных таблиц.Если у вас нет вкладки «Результаты», запустите пункт меню «Создать вкладку результатов», и вы получите новые страницы результатов.После этого просто продолжайте "Найти строку на активной странице" в новом меню.Результаты каждого поиска будут отображены в диалоговом окне, и все результаты будут добавлены на вкладку «Результаты».Цель состояла в том, чтобы отобразить строки, которые имели по крайней мере одну ячейку, содержащую строку поиска, даже в качестве подстроки.

function createMenu(){
  SpreadsheetApp.getUi().createMenu('My Menu')
  .addItem('Create a Results Tab', 'createResultsPage')
  .addItem('Find A String on Active Page', 'findAString')
  .addToUi();
}

function findAString(){
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getActiveSheet();
  var sh2=ss.getSheetByName('Results');
  var resp=SpreadsheetApp.getUi().prompt("Enter a String");
  var s=resp.getResponseText();
  if(s){
    var rA=findRow(resp.getResponseText());
    Logger.log(rA);
    if (rA.length>0){
      sh2.getRange(sh2.getLastRow()+1,1,rA.length,rA[0].length).setValues(rA);
      var rows='<br /><h3>All Search Results are Appended to the Results Tab</h3><br />';
      rows+=Utilities.formatString('<br />These are the rows that contain: %s<br />',resp.getResponseText());
      for(var i=0;i<rA.length;i++){
        rows+=Utilities.formatString('<br /> %s',rA[i].join(' '));
      }
      rows+='<br /><input type="button" value="Exit" onClick="google.script.host.close();" />';
      if(rows){
        var ui=HtmlService.createHtmlOutput(rows);
        SpreadsheetApp.getUi().showModelessDialog(ui, 'Search Results')
      }
    }
  }else{
    throw('Error: Invalid Response');
  }
 }

function findRow(s) { ;// the actual search function
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getActiveSheet()
    var rA=[];
    var vA=sh.getDataRange().getValues();
    for(var i=0;i<vA.length;i++) {
      for(var j=0;j<vA[i].length;j++){
        if(vA[i][j].toString().indexOf(s)>-1){
          rA.push(vA[i]);
          break;
        }
      }
    }
    Logger.log(rA);
    return rA;
}

function createResultsPage(){
  var ss=SpreadsheetApp.getActive();
  if(ss.getSheets().indexOf('Results')==-1){
    ss.insertSheet('Results')
  }
}

Please take a look at the help menu in the Script Editor and familiarize yourself with all of those references.  They are always changing so just about the time you think you know it all.  You can be pretty sure that you don't because something has been changed since the last time your visited them.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...