Как использовать если отчеты для запуска второй функции Google script - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь ускорить мой сценарий, сейчас я его настроил так, что при нажатии кнопки появляется настраиваемое диалоговое окно (HTML), задающее некоторые вопросы. При отправке он вызывает функцию gs для извлечения информации в виде переменных. В зависимости от первого ответа у меня есть ряд операторов If, которые срабатывают. Каждый из них извлекает свой шаблон, делает копию, заполняет некоторые ячейки, отправляет вам по электронной почте и затем сбрасывает данные в трекер. Каждый из них различен, поэтому сценарий довольно длинный - есть ли способ, чтобы каждый из них имел свою функцию? Поможет ли это даже скорости? Я новичок в написании сценариев, поэтому любые отзывы приветствуются. Ниже приведен код и HTML

function onOpen() //adds option to top row in case buttons are not working.
{
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Create Doc.')
      .addItem('Create Tracked Document', 'addItem')
      .addToUi();
}

function addItem()//starts the initiation process
{
  var html = HtmlService.createTemplateFromFile('form')
   .evaluate()
  .setWidth(300)
  .setHeight(550);
  SpreadsheetApp.getUi()  
  .showModalDialog(html, 'Create New Document');
}


function addNewItem(form_data)//pulls data from form
{
  var ui = SpreadsheetApp.getUi();
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  var n = new Date();
  var now = ((n.getMonth()+1) + "/" + n.getDate() + "/" + n.getFullYear());
  var doctyp = form_data.Document_Type;
  var name = form_data.Name;
  var title = form_data.Title;
  var platform = form_data.Platform;
  var area = form_data.Area;
  var rota = form_data.Rotation;
  var works = form_data.WorkSt;
  var recipient = Session.getEffectiveUser().getEmail();


  if (form_data.Document_Type == "Text2"){

     var dumpfolder = DriveApp.getFolderById("12345")
    var templateSheet =  DriveApp.getFileById("67890");
    var Newform2= templateSheet.makeCopy(title+ " "+now,dumpfolder);
    var qs = SpreadsheetApp.open(Newform2);
    var dropSheet = qs.getSheetByName("blank");
    var URL3 = Newform2.getUrl();
      dropSheet.getRange("i8").setValue(title);
      dropSheet.getRange("bc5").setValue(now);
      dropSheet.getRange("b5").setValue(platform);
      dropSheet.getRange("p5").setValue(area);
      dropSheet.getRange("x5").setValue(rota);
      dropSheet.getRange("al5").setValue(works);
      dropSheet.getRange("at6").setValue(name);
      NewOPLPOA.setSharing(DriveApp.Access.DOMAIN,DriveApp.Permission.COMMENT);
      NewOPLPOA.setOwner("ME");

      sheet.appendRow([now,doctyp,name,title,platform,area,rota,works,URL3]); 

    GmailApp.sendEmail(recipient, title+ " has been created.", "Your document has been created." +'\n'+ "Here is the link to your copy! Link: " + URL3);

   ui.alert("Email Sent", "An email has been sent with your documents link. You can also use the below link to view the document now, click ctrl C to copy. \
    " +  URL3, ui.ButtonSet.OK);
     }


else if (form_data.Document_Type == "Text1"){

    var dumpfolder = DriveApp.getFolderById("abcd")
    var templateSheet =  DriveApp.getFileById("bgtrd");
    var Newform1 = templateSheet.makeCopy(title+ " "+now,dumpfolder);
    var qs = SpreadsheetApp.open(Newform1);
    var dropSheet = qs.getSheetByName("DOC1");
    var URL4 = Newform1.getUrl();
      dropSheet.getRange("aa3").setValue(platform);
      dropSheet.getRange("ah3").setValue(area);
      dropSheet.getRange("ao3").setValue(works);
      NewSEWO.setSharing(DriveApp.Access.DOMAIN, DriveApp.Permission.COMMENT);
      NewSEWO.setOwner("Me");

    sheet.appendRow([now,doctyp,name,title,platform,area,rota,works,URL4]); 

    GmailApp.sendEmail(recipient, title+ " has been created.", "Your document has been created." +'\n'+ "Here is the link to your copy! Link: " + URL4);

   ui.alert("Email Sent", "An email has been sent with your documents link. You can also use the below link to view the document now, click ctrl C to copy. \
    " +  URL4, ui.ButtonSet.OK);

  } 
  else{
    ui.alert("Error, Please try again, make sure you are listing all required information.");
  }
}

- HTML -

<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  </head>
  <body>
  <form id="myform">

    <div class="form-group">
    <label for="Document_Type">Document Type</label>
     <select class="form-control" id="Document_Type" name = "Document_Type" required="required">
  <?
 var SS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Set Up");
var Avals = SS.getRange("A2:A").getValues();
var numberOfValues = Avals.filter(String).length;
var RangeVals = SS.getRange(2,1,numberOfValues).getValues();
  ?>
    <option disabled selected value> -- select an option -- </option>
    <? for (var i = 0; i < RangeVals.length; ++i) { ?>

      <option><?!= RangeVals[i] ?></option>
    <? } ?>
  </select>
  </div>

    <div class="form-group">
    <label for ="Name">Your Name</label>
    <select class="form-control" name='Name' id="Name" required="required">
       <?
var AvalN = SS.getRange("E2:E").getValues();
var numberOfValuesN = AvalN.filter(String).length;
var RangeValsN = SS.getRange(2,5,numberOfValuesN).getValues();
  ?>

    <option disabled selected value> -- select an option -- </option>
    <? for (var i = 0; i < RangeValsN.length; ++i) { ?>

      <option><?!= RangeValsN[i] ?></option>
    <? } ?>   
    </select>
    </div>


    <div class="form-group">
    <label for="Platform">Platform</label>
    <select class="form-control" id="Platform" name = "Platform" required="required">
             <?
var AvalP = SS.getRange("C2:C").getValues();
var numberOfValuesP = AvalP.filter(String).length;
var RangeValsP = SS.getRange(2,3,numberOfValuesP).getValues();
  ?>
        <option disabled selected value> -- select an option -- </option>
<? for (var i = 0; i < RangeValsP.length; ++i) { ?>

      <option><?!= RangeValsP[i] ?></option>
    <? } ?>   
    </select>
    </div>

     <div class="form-group">
    <label for="Area">Area</label>
    <select class="form-control" id="Area" name = "Area" required="required">
             <?
var AvalA = SS.getRange("D2:D").getValues();
var numberOfValuesA = AvalA.filter(String).length;
var RangeValsA = SS.getRange(2,4,numberOfValuesA).getValues();
  ?>
       <option disabled selected value> -- select an option -- </option>
 <? for (var i = 0; i < RangeValsA.length; ++i) { ?>

      <option><?!= RangeValsA[i] ?></option>
    <? } ?>   
    </select>
    </div>

    <div class="block form-group">
    <label for="Rotation">Rotation</label>
    <select class="form-control" name='Rotation' id="Rotation">
          <?
var AvalR = SS.getRange("F2:F").getValues();
var numberOfValuesR = AvalR.filter(String).length;
var RangeValsR = SS.getRange(2,6,numberOfValuesR).getValues();
  ?>
    <option disabled selected value> -- select an option -- </option>
<? for (var i = 0; i < RangeValsR.length; ++i) { ?>

      <option><?!= RangeValsR[i] ?></option>
    <? } ?>   
   </select>
   </div>


    <div class="block form-group">
    <label for="WorkSt">Work Station</label>
    <input type='text' name='WorkSt' id="WorkSt" />
    </div>

    <div class="block form-group">
    <label for="Title">Title</label>
    <input type='text' name='Title' id="Title" required="required"/>
    </div>


    <div class="block">
    <button type="submit" class="action">Submit</button>

    </div>
    </form>
    <script>
    document.querySelector("#myform").addEventListener("submit", 
    function(e)
    {
    e.preventDefault();    //stop form from submitting
    google.script.run.addNewItem(this);
     google.script.host.close();//close this dialogbox
    }
    );
    </script>
  </body>
</html>

1 Ответ

0 голосов
/ 02 апреля 2020

есть ли способ, чтобы каждый оператор if выполнял свою функцию?

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

function addNewItem(form_data)//pulls data from form
{
  var ui = SpreadsheetApp.getUi();
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  var n = new Date();
  var now = ((n.getMonth()+1) + "/" + n.getDate() + "/" + n.getFullYear());
  var doctyp = form_data.Document_Type;
  var name = form_data.Name;
  var title = form_data.Title;
  var platform = form_data.Platform;
  var area = form_data.Area;
  var rota = form_data.Rotation;
  var works = form_data.WorkSt;
  var recipient = Session.getEffectiveUser().getEmail();
  if (form_data.Document_Type == "Text2"){
     function1();     
     }
  else if (form_data.Document_Type == "Text1"){
    function2();
  } 
  else{
    ui.alert("Error, Please try again, make sure you are listing all required information.");
  }

function function1(){
  var dumpfolder = DriveApp.getFolderById("12345")
  var templateSheet =  DriveApp.getFileById("67890");
  ...
}
function function2(){
  var dumpfolder = DriveApp.getFolderById("abcd")
  ...
}

Это поможет скорости?

Не совсем. Чтобы ускорить процесс, вам следует попытаться внедрить Best Practices .

В частности: уменьшить количество повторных вызовов внешним службам, включая SpreadsheetApp.

Например, попытайтесь расположить ячейки, которым вы хотите присвоить значения, в соседний диапазон, чтобы вы могли использовать метод setValues() вместо нескольких setValue() и таким образом повысить эффективность своего кода.

Пример:

var range = dropSheet.getRange("I8:N8");
var values = [];
values[0] = [];
values[0].push(title, now, platform, area, rota, works, name);
range.setValues(values);

Кроме того, постарайтесь не повторять один и тот же запрос для каждого условия if, а сделайте один запрос после выхода из оператора if, например, для:

sheet.appendRow([now,doctyp,name,title,platform,area,rota,works,URL3]); 
GmailApp.sendEmail(recipient, title+ " has been created.", "Your document has been created." +'\n'+ "Here is the link to your copy! Link: " + URL3);
 ui.alert("Email Sent", "An email has been sent with your documents link. You can also use the below link to view the document now, click ctrl C to copy. \
    " +  URL3, ui.ButtonSet.OK);

Я надеюсь это помогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...