学习如何运行功能

时间:2018-12-14 01:06:13

标签: google-apps-script

已经发现此代码与我想做的非常相似。 最初的张贴者意图是能够在工作表中搜索单词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);
   }
 }

我得到一个PROCESS菜单选项,选择Next Order,然后弹出输入框。 可以在此处输入一个字符串,然后选择“确定”,但是脚本会抱怨。

  

ReferenceError:未定义“ findRow”。

向前推进?

1 个答案:

答案 0 :(得分:0)

好的,这次我尝试创建一个完整的解决方案,以便您能看到一些成功。我有一个功能来创建菜单,另一个功能来创建“结果”选项卡。将所有功能加载到脚本编辑器中,然后运行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.
相关问题