У меня есть скрипт, который модифицирует некоторые листы с защищенными полями.Этот скрипт должен запускать любой, кто использует 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».
Так что теперь я застрял и не уверен, как это сделать, или если это даже лучшее решение моей проблемы, надеясь, что кто-то с большим опытом может помочь.Спасибо!