Как опубликовать Google App Script как веб-приложение и вызвать его из Google Sheet - PullRequest
0 голосов
/ 02 июня 2019

У меня есть скрипт, который модифицирует некоторые листы с защищенными полями.Этот скрипт должен запускать любой, кто использует Google лист, вошли или нет.При попытке выяснить это кто-то порекомендовал опубликовать сценарий в виде веб-приложения и разрешить любому запускать его.Я сделал это, но я не уверен, как вызвать веб-приложение с листа Google.

Итак, я опубликовал скрипт как веб-приложение, а затем попытался вызвать URL.Мой скрипт ниже:

function doGet(e){
  confirm(); // This is your function that writes to the protected sheet
}

function confirm(){
  var ui = SpreadsheetApp.getUi();
  var response = ui.alert('This will submit the timesheet. Do you want to continue?', ui.ButtonSet.YES_NO);
  if(response == ui.Button.NO) return;
  emailGoogleSpreadsheetAsPDF();
}

/* Email Google Spreadsheet as PDF */
function emailGoogleSpreadsheetAsPDF() {

  // Send the PDF of the spreadsheet to this email address
  var email = "email@gmail.com"; 
  var exclA=['Timesheet','Note','Settings','Data'];//and others
  var timeS=SpreadsheetApp.getActive().getSheetByName('Timesheet')
  var ss=SpreadsheetApp.getActive();
  var name=ss.getRange("Timesheet!J6").getValue();//trimmed the range down to match the getValue();
  var tname=ss.getRange("Timesheet!J6").getValue();
  var agency=ss.getRange("Timesheet!B4").getValue();//same here
  var fldr=DriveApp.getFolderById('abc123thu8h7r8888tbgyru');
  var fA=[];
  var today=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"MM/dd/yyyy");
  var subject=Utilities.formatString('%s has Submitted Their Timesheet and Notes',name); 
  var body=Utilities.formatString('This was submitted on %s',today);
  var shts=ss.getSheets();

  SpreadsheetApp.flush();//this may not be necessary...not sure
  var file=fldr.createFile(ss.getBlob().getAs('application/pdf')).setName(Utilities.formatString('%s_%s_%s_timesheet_notes.pdf', tname,agency,today));
  fA.push(file)

  for(var i=0;i<shts.length;i++) {
    var sh=shts[i];
    var name=sh.getName();
    if(exclA.indexOf(name)==-1) {
      sh.showSheet();
      for(var j=0;j<shts.length;j++) {
        if(shts[j].getName()!=name) {
          shts[j].hideSheet();
        }
      }
      SpreadsheetApp.flush();//this may not be necessary...not sure
      var file=fldr.createFile(ss.getBlob().getAs('application/pdf')).setName(Utilities.formatString('%s_%s_%s_note.pdf', name,agency,today));
      fA.push(file);
    }
  }
  for(var i=0;i<shts.length;i++) {
    if(exclA.indexOf(shts[i].getName())==-1) {
      shts[i].showSheet();
    }
  }
  timeS.showSheet();

  GmailApp.sendEmail(email,subject,body, {attachments:fA});
  for(var i=0;i<fA.length;i++) {
    fA[i].setTrashed(true); 
  }
  //CopyDataToNewFile();
}

function makeCopy() {
  var ss =SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Note');
  var dSheet = sheet.copyTo(SpreadsheetApp.openById(ss.getId()))
  dSheet.showSheet()
};

function CopyDataToNewFile(targetSheetName,targetSsId, sourceSheetName,sourceSsId) {
  var ss = SpreadsheetApp.openById('gnu84uw84nwutnst9ntrgbrn').getSheetByName('Timesheet');
  var ssd = SpreadsheetApp.openById('h3487g8bg8ybw4gy8wytb').getSheetByName('Sheet1');

  var therapist = ss.getRange('J6').getValues();
  var thedate = ss.getRange('A10').getValues();
  var theagency = ss.getRange('B4:C4').getValues();
  var thepayperiod = ss.getRange('B6:C6').getValues();
  var thecost = ss.getRange('E24').getValues();
  var themileage = ss.getRange('E27').getValues();

  ssd.getRange(ssd.getLastRow()+1,1,therapist.length,therapist[0].length).setValues(therapist);
  ssd.getRange(ssd.getLastRow()+0,2,thedate.length,thedate[0].length).setValues(thedate);
  ssd.getRange(ssd.getLastRow()+0,3,theagency.length,theagency[0].length).setValues(theagency);
  ssd.getRange(ssd.getLastRow()+0,4,thepayperiod.length,thepayperiod[0].length).setValues(thepayperiod);
  ssd.getRange(ssd.getLastRow()+0,5,thecost.length,thecost[0].length).setValues(thecost);
  ssd.getRange(ssd.getLastRow()+0,6,themileage.length,themileage[0].length).setValues(themileage);

}

Я добавил функцию doGet(e) в начало, потому что я думал, что это то, что нужно для запуска скрипта при вызове.

На листе у меня есть кнопка, которую я изначально сделал, и я использовал опцию сценария назначения для вызова моей функции confirm().После того, как я опубликовал сценарий в качестве веб-приложения, я попытался поместить URL-адрес в поле «Назначить сценарий», но это не сработало, а затем попытался просто создать гиперссылку на веб-приложение и получить сообщение об ошибке «Функция сценария не найдена: doGet».

Так что теперь я застрял и не уверен, как это сделать, или если это даже лучшее решение моей проблемы, надеясь, что кто-то с большим опытом может помочь.Спасибо!

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