Используя листы / скрипты Google, я создал систему проверки библиотек для моего студенческого центра.
Он использует много вызовов функции onEdit.Код не очень оптимизирован.
Две проблемы, с которыми я сталкиваюсь: 1) Я не могу заставить новых пользователей дать разрешение / или увидеть приглашение на авторизацию гранта.2) Во время процесса развертывания авторизация для владельца (себя) нарушена (описано ниже).
Я попытался развернуть его как надстройку и впоследствии отозвал, что, как только обнаружил, что это не решает проблемумоя проблема (1).
С тех пор функции сломались для меня.Я попытался удалить текущие триггеры, а затем повторно реализовать их.
В ходе этого процесса у меня есть несколько версий и созданы события триггера для самой последней версии (которую я редактирую).
Если я заставлю запустить основную функцию, она запросит авторизацию.Я даю это, и скрипт работает для последнего события onEdit.
Затем он перестает работать.
Если я снова нажимаю кнопку воспроизведения / запуска, он снова запрашивает аутентификацию пользователя.
У меня нет понятия, с чего начать отладку этогопроблема (2), и это уводило меня от моей первоначальной проблемы (1).
Любое понимание полезно.Спасибо.
Настройка проверки подлинности области в файле appscript.json.Отмена развертывания надстройки приложения.
/*
TODO:
Update the schedule remiders for renewal option DONE
Highlighting DONE
Popup for check in. DONE
* Fix user auth
Popup confirm for check out. DONE
* Sheet sorting - https://stackoverflow.com/questions/35563652/automatic-sorting-on-sheets
* https://www.extendoffice.com/documents/excel/4707-google-sheets-count-number-of-occurrence.html
* historical log -> # occurances top 5-10 books
email reminder inscript DONE
* initial reminder & 1 week out & 2 days out & when renewed
hide student data columns w checkbox DONE
Unhide! DONE
public facing DONE
dynamic fields DONE
google calendar add CANT BE DONE
SEE ABOVE google calendar notification for 1 week prior and 2 days prior. https://developers.google.com/apps-script/reference/calendar/calendar-event
*/
function myFunction() {
// authorize();
var changelogSheetName = "Checked Out Items History.";
var mains = "QRC Check Out";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var cell = sheet.getActiveCell();
var sheetName = sheet.getName();
var datenow = new Date();
var changelogSheet = ss.getSheetByName(changelogSheetName);
var copyfrom = ss.getSheetByName(mains);
var range = copyfrom.getRange("A3:N500");
if (cell.getA1Notation() == 'J2' )
{
range.sort(6);
}
if (cell.getA1Notation() == 'K2' )
{
range.sort(7);
}
if (cell.getA1Notation() == 'A1')
{
if (cell.getValue() == 1){
copyfrom.hideColumns(4,5);
cell.setNote("Check to hide student data. Un-check to show.");
}
else{
copyfrom.showColumns(4,5);
}
}
if (cell.getColumn() == 1 & cell.getRow() > 2)
{
var ui = SpreadsheetApp.getUi(); // Used for both if conditions.
if(cell.getValue() == 1){
name = ui.prompt('Enter the Students name:',ui.ButtonSet.OK);
copyfrom.getRange(cell.getRow(), 5,1,1).setValue(name.getResponseText());
emerzadd = ui.prompt('Enter the Students PCC E-Mail address:',ui.ButtonSet.OK);
copyfrom.getRange(cell.getRow(), 6,1,1).setValue(emerzadd.getResponseText());
// var regEX = new RegExp("(pcc.edu)");
// var postmailone = regEX.test(emerzadd);
gammynum = ui.prompt('Enter the Students G-Number:',ui.ButtonSet.OK);
copyfrom.getRange(cell.getRow(), 7,1,1).setValue(gammynum.getResponseText());
var outdate = datenow;
copyfrom.getRange(cell.getRow(), 4,1,1).setValue(outdate); //sets current date
var data1 = copyfrom.getRange(cell.getRow(),1,1,12).getValues(); // pickup newly entered data for history log
data1[0].unshift(datenow); // add timedate to array to be written
changelogSheet.appendRow(data1[0] ); // write the row to the history log
sendinfo(data1); // send this info to make an initial nag reminder
// var event = CalendarApp.getDefaultCalendar().createEvent('QRC Materials Due ' + data1[11], new Date(data1[4]),new Date(data1[4] + '1:00')); // add calendar entry
}
else if (cell.getValue() == 0) // if check box gets unchecked, delete student data from working library
{
var erase = ui.alert('Are you sure you want to check the book back in?',ui.ButtonSet.YES_NO)
if (erase == ui.Button.YES){
copyfrom.getRange(cell.getRow(),4,1,5).clearContent().clearNote();
} else {
copyfrom.getRange(cell.getRow(), 1,1,1).setValue('TRUE');
}
}
}
}
function sendinfo(reminderdata){
var reminderdata = reminderdata;
var Sheet8a = "Sheet8";
var details = "Details";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var Sheet8 = ss.getSheetByName(Sheet8a);
var deetsheet = ss.getSheetByName(details);
confi = deetsheet.getRange(2,3,12,1).getValues();
var qrclogoURL = confi[8];
var qrclogoBLOB = UrlFetchApp
.fetch(qrclogoURL)
.getBlob()
.setName("qrclogoBLOB");
var timenow = reminderdata[0];
var duedate = reminderdata[2];
var sdtname = reminderdata[5];
var sdemail = reminderdata[6];
var gnumber = reminderdata[7];
var isrenew = reminderdata[8];
var medianm = reminderdata[10];
// nothing = ui.prompt('0' + timenow + reminderdata[0],ui.ButtonSet.OK);
// var author1 = [ reminderdata[12], reminderdata[11] ];
// var authors = author1.join(' ');
// Sheet8.appendRow(reminderdata);
// for (var t = 0; t < reminderdata.length; t++){
// Sheet8.appendRow(reminderdata[t]);
// Sheet8.appendRow();
// }
subjectline = "Thanks for checking out " + medianm + " from the SYQRC. Due: " + duedate;
MailApp.sendEmail({
to: sdemail,
subject: subjectline,
htmlBody: "wib wib",
inlineImages:
{
qrcLOGO: qrclogoBLOB
}
});
}
function scheduledreminder(){
var checkedout = "Currently Checked Out Materials";
var details = "Details";
var Sheet8a = "Sheet8";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var cell = sheet.getActiveCell();
var sheetName = sheet.getName();
var checkme = ss.getSheetByName(checkedout);
var Sheet8 = ss.getSheetByName(Sheet8a);
var deetsheet = ss.getSheetByName(details);
confi = deetsheet.getRange(2,3,12,1).getValues();
// for (var t = 0; t < confi.length; t++){
// Sheet8.appendRow(confi[t]);
// }
var qrcroom = confi[0];
var building = confi[1];
var rf = confi[5];
var phonenum = confi[6];
var email = confi[7];
var qrclogoURL = confi[8];
var pubaxs = confi[9];
// var qrclogoURL = "https://www.pcc.edu/queer/wp-content/uploads/sites/25/2018/06/QRC-wide-500x500.png";
var qrclogoBLOB = UrlFetchApp
.fetch(qrclogoURL)
.getBlob()
.setName("qrclogoBLOB");
data5 = checkme.getRange(3,1,checkme.getRange("B1:B500").getLastRow()-2,10).getValues();
for (var xx = 0; xx < data5.length; xx++){
var datdata = data5[xx];
var daysod = datdata[1];
var duedate = datdata[2];
var checkdate = datdata[3];
var namey = datdata[4];
var emil = datdata[5];
var booknem = datdata[9];
var frequency = new Date();
frequency -= duedate;
// Sheet8.appendRow(datdata); //Copy checked out items to page sheet 8 for debugging reasons.
subjectline = 'Materials due: ' + booknem;
if (daysod >= 13.5 && (daysod % 7 > 0 && daysod % 7 < 1)) {
MailApp.sendEmail({
to: emil,
subject: subjectline,
htmlBody: "<h1><strong>Library Materials Overdue</strong></h1>" +
"<p><strong>Hi " + namey + ",<p>" +
"We hope you had time to enjoy the media: " + booknem + " which you checked out on " +
Utilities.formatDate(checkdate, 'America/ Portland', 'EEE, MMM d, \'\'yy') +
". It is now "+ Math.round(daysod) +" days overdue, and was due back on " + Utilities.formatDate(duedate, 'America/ Portland', 'EEE, MMM d, \'\'yy') +
". If you have already returned the media, disregard this message. </strong></p> " +
"<h4><strong>If you have not yet brought it back to the Sylvania QRC, located in <span style=\"color: #ff6600;\">room " +
qrcroom + " inside the " + building + " building</span>, please do so at your earliest convenience. You may check " +
"the material in with any advocate that is currently on shift.</strong></h4>" +
" <p><strong>Thanks for helping us keep our library accessible to everyone. Have a great day and we hope you continue " +
"to enjoy our library.</strong></p> " +
"<p><strong>Phone: " + phonenum + "</strong></p> "+
"<p><strong>Email: " + email + " </strong></p>" +
"<p><strong>Open Monday-Thursday during Fall, Winter, and Spring Terms.</strong></p>" +
"<p><strong>Mon: 10am-5pm </strong><br /><strong>Tues: 10am-5pm</strong><br /><strong>Wed: 10am-2pm</strong><br /><strong>Thurs: 10am-6pm</strong><br /><strong>Fri: Closed</strong></p>" +
"<p><strong>Summer Term: available by appointment</strong></p>" +
"<p><strong>The QRC is closed during finals week and breaks between terms.</strong></p>" +
"<p> </p> <p><p><strong>Sincerely,</strong></p> <p><strong>" +
"The Librarians at ...</strong></p> <p><p><img src='cid:qrcLOGO'>",
inlineImages:
{
qrcLOGO: qrclogoBLOB
}
});
}
}
}
/*
RESOURCES USED (no particular order):
1 https://html-online.com/editor/
https://support.google.com/a/answer/1371415?hl=en
https://developers.google.com/apps-script/reference/calendar/calendar-event
https://developers.google.com/apps-script/concepts/scopes
https://developers.google.com/apps-script/guides/services/authorization
https://support.google.com/docs/forum/AAAABuH1jm0Ujpf-tJQrCs/?hl=en&msgid=-6uY3F5kR9UJ&gpf=d/msg/docs/Ujpf-tJQrCs/-6uY3F5kR9UJ
https://stackoverflow.com/questions/19004774/popup-authorization-code-documentapp-google-apps-script
https://developers.google.com/apps-script/guides/triggers/installable#managing_triggers_programmatically
https://developers.google.com/sheets/api/guides/concepts
https://stackoverflow.com/questions/18840885/google-script-error/19853912
https://developers.google.com/apps-script/reference/script/script-app#newTrigger(String)
https://stackoverflow.com/questions/36178369/how-to-include-inline-images-in-email-using-mailapp
https://stackoverflow.com/questions/10699726/escaping-characters-in-javascript-single-and-double-quotes
https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
http://patorjk.com/software/taag/#p=display&f=Doh&t=yeet%20the%20patriarchy
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join
https://developers.google.com/apps-script/articles/sending_emails
https://developers.google.com/apps-script/concepts/scopes
https://stackoverflow.com/questions/46213101/can-we-hide-column-in-sheet-using-google-apps-script
https://developers.google.com/apps-script/guides/dialogs
https://developers.google.com/apps-script/guides/triggers/installable
https://developers.google.com/apps-script/reference/base/browser
https://developers.google.com/apps-script/reference/mail/mail-app
https://developers.google.com/apps-script/reference/script/clock-trigger-builder
https://developers.google.com/apps-script/reference/spreadsheet/range#clearNote()
https://developers.google.com/apps-script/reference/spreadsheet/sheet#appendRow(Object)
https://developers.google.com/apps-script/reference/spreadsheet/sheet#getDataRange()
https://stackoverflow.com/questions/11334296/google-sheet-script-set-cell-value
https://stackoverflow.com/questions/11947590/sheet-getrange1-1-1-12-what-does-the-numbers-in-bracket-specify
https://stackoverflow.com/questions/41383415/copy-and-past-multiple-rows-ljava-lang-object-response
https://stackoverflow.com/questions/45155847/google-script-project-trigger-not-running/45157034#45157034
https://stackoverflow.com/questions/51068726/set-value-of-checkbox
https://stackoverflow.com/questions/9268570/i-need-a-button-to-clear-cells-in-a-google-spreadsheet
https://support.google.com/docs/answer/3094140?hl=en
https://stackoverflow.com/questions/51131119/passing-arguments-in-google-apps-script
https://support.google.com/docs/forum/AAAABuH1jm08lc5kRzvdY8/?hl=en&msgid=DQAegY4rAwAJ&gpf=d/msg/docs/8lc5kRzvdY8/DQAegY4rAwAJ
https://webapps.stackexchange.com/questions/89063/how-to-include-multiple-if-statements-in-one-cell-in-google-sheets/89068
https://www.benlcollins.com/spreadsheets/vlookup-multiple-criteria/
https://www.extendoffice.com/documents/excel/4742-google-sheets-vlookup-multiple-values.html
https://www.portent.com/blog/analytics/google-app-script-1.htm
https://www.w3schools.com/js/js_arrays.asp
https://www.w3schools.com/jsref/jsref_unshift.asp
https://stackoverflow.com/questions/21679267/length-of-two-dimensional-array-in-javascript-google-apps-script
https://developers.google.com/apps-script/guides/support/best-practices
https://stackoverflow.com/questions/15664696/minus-equals-in-javascript-what-does-it-mean
https://www.wikihow.tech/Pull-Data-from-Another-Sheet-on-Google-Sheets-on-PC-or-Mac
https://support.google.com/docs/forum/AAAABuH1jm0lUGZ108vh-E/?hl=en&gpf=%23!topic%2Fdocs%2FlUGZ108vh-E
https://www.benlcollins.com/spreadsheets/conditional-formatting-entire-row/
https://www.w3schools.com/js/js_arithmetic.asp
*/
(1) При открытии листа новым пользователем, запросите авторизацию.
(2) Общие функции для владельца без повторной авторизации.