#javascript #google-apps-script #google-sheets
#javascript #google-apps-script #google-sheets
Вопрос:
В рамках системы посещаемости учащихся я хотел бы добавить цветную полосу в каждую последнюю строку класса для посещаемости с помощью скриптов приложений. Моими столбцами таблиц Google являются: (i) дата, (ii) адрес электронной почты, (iii) Широта, (iv) долгота и (v) Код темы. Перепробовал много способов, но не нашел решения.
var sss = SpreadsheetApp.getActiveSpreadsheet();
var ssID = sss.getId();
var sheetName = sss.getName();
var sheet = sss.getSheetByName("TempDataSet");
var sheet1 = sss.insertSheet('TempDataSet_temp');
sheet.getDataRange().copyTo(sheet1.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
sheet.getDataRange().copyTo(sheet1.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
var shID = sheet1.getSheetId().toString();
sheet1.getRange(2, 1, sheet.getLastRow() -1, sheet.getLastColumn()).sort({column: 1, ascending: false});
var columns_delete = [7,2]; //[7,5,4,2];
columns_delete.forEach(col=>sheet1.deleteColumn(col));
//const sss = SpreadsheetApp.getActiveSpreadsheet();
//const sheet = sss.getSheetByName("TempDataSet");
const subs = sheet.getRange('F2:F' sheet.getLastRow()).getValues().flat();
const usubs = subs.filter((value, index, self)=>self.indexOf(value) === index);
const dts = sheet.getRange('A2:A' sheet.getLastRow()).getDisplayValues().flat();
const udts = dts.filter((value, index, self)=>self.indexOf(value) === index);
if(usubs.length>1){
subs.forEach((s,i)=>{
if(i>1){
if(subs[i]!=subs[i-1]){
sheet.getRange(i 1,1,1,5).setBackground('yellow');
}}});
}
else if (udts.length>1){
dts.forEach((d,i)=>{
if(i>1){
if(dts[i]!=dts[i-1]){
sheet.getRange(i 1,1,1,5).setBackground('yellow');
}}});
}
var from = Session.getActiveUser().getEmail();
var subject = 'Batch Attendance Record for Your Reference';
var body = 'Dear Student,' 'nn' 'Greetings! Please find the batch attendance record attached. Stay safe and blessed.' 'nn' 'Thank you.';
var requestData = {"method": "GET", "headers":{"Authorization":"Bearer " ScriptApp.getOAuthToken()}};
var url = "https://docs.google.com/spreadsheets/d/" ssID "/export?format=xlsxamp;id=" ssID "amp;gid=" shID;
var result = UrlFetchApp.fetch(url , requestData);
var contents = result.getContent();
sss.deleteSheet(sss.getSheetByName('TempDataSet_temp'));
var sheet2 = sss.getSheetByName('StudentList');
var data = sheet2.getLastRow();
var students = [];
var students = sheet2.getRange(2, 6, data).getValues();
//MailApp.sendEmail(students.toString(), subject ,body, {attachments:[{fileName:sheetName ".xlsx", content:contents, mimeType:"MICROSOFT_EXCEL"}]});
for (var i=0; i<students.length; i ){ // you are looping through rows and selecting the 1st and only column index
if (students[i][0] !== ''){
MailApp.sendEmail(students[i][0].toString(), subject ,body, {attachments:[{fileName:sheetName ".xlsx", content:contents, mimeType:"MICROSOFT_EXCEL"}]});
//MailApp.sendEmail(students[i][0].toString(), subject ,body, {from: from, attachments:[{fileName:"YourAttendaceRecord.xlsx", content:contents, mimeType:"MICROSOFT_EXCEL"}]});
}
}
Ответ №1:
Объяснение:
Исходя из вашего вопроса, я понимаю следующие шаги:
-
Проверьте, есть ли у вас по крайней мере два уникальных предмета в столбце E. Один из способов сделать это — найти уникальный список предметов. Если длина этого списка равна
2
или больше, это означает, что у вас разные предметы. В этом случае первый блокif
инструкции оцениваетсяtrue
как, и вы добавляете желтую строку в строку перед изменением темы. -
Если у вас есть только один предмет, а именно длина уникального списка предметов
1
, первый блокif
инструкции будет оцениватьсяfalse
. В этом случае скрипт проверит, содержит ли столбец A2
или более уникальных дат. Если это произойдет,if
будет выполнен второй блок инструкции, и скрипт добавит желтую строку в строку перед изменением даты. В противном случае он ничего не сделает.
Решение:
Вы можете выполняться color()
как отдельный скрипт. Я бы посоветовал вам сохранить эту функцию в новом .gs
файле, а затем просто вызвать ее в вашем текущем скрипте. А именно, поместите в color()
любое место, которое вы хотите, в предоставленном вами фрагменте кода.
function color() {
const sss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = sss.getSheetByName("TempDataSet");
const subs = sheet.getRange('E2:E' sheet.getLastRow()).getValues().flat();
const usubs = subs.filter((value, index, self)=>self.indexOf(value) === index);
const dts = sheet.getRange('A2:A' sheet.getLastRow()).getDisplayValues().flat();
const udts = dts.filter((value, index, self)=>self.indexOf(value) === index);
if(usubs.length>1){
subs.forEach((s,i)=>{
if(i>1){
if(subs[i]!=subs[i-1]){
sheet.getRange(i 1,1,1,5).setBackground('yellow');
}}});
}
else if (udts.length>1){
dts.forEach((d,i)=>{
if(i>1){
if(dts[i]!=dts[i-1]){
sheet.getRange(i 1,1,1,5).setBackground('yellow');
}}});
}
}
Полное решение:
function sendEmails(){
var sss = SpreadsheetApp.getActiveSpreadsheet();
var ssID = sss.getId();
var sheetName = sss.getName();
var sheet = sss.getSheetByName("TempDataSet");
var sheet1 = sss.insertSheet('TempDataSet_temp');
sheet.getDataRange().copyTo(sheet1.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
sheet.getDataRange().copyTo(sheet1.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
var shID = sheet1.getSheetId().toString();
sheet1.getRange(2, 1, sheet.getLastRow() -1, sheet.getLastColumn()).sort({column: 1, ascending: true});
var columns_delete = [7,2]; //[7,5,4,2];
columns_delete.forEach(col=>sheet1.deleteColumn(col));
SpreadsheetApp.flush();
const subs = sheet1.getRange('E2:E' sheet1.getLastRow()).getValues().flat();
const usubs = subs.filter((value, index, self)=>self.indexOf(value) === index);
const dts = sheet1.getRange('A2:A' sheet1.getLastRow()).getDisplayValues().flat();
const udts = dts.filter((value, index, self)=>self.indexOf(value) === index);
if(usubs.length>1){
subs.forEach((s,i)=>{
if(i>1){
if(subs[i]!=subs[i-1]){
sheet1.getRange(i 1,1,1,5).setBackground('yellow');
}}});
}
else if (udts.length>1){
dts.forEach((d,i)=>{
if(i>1){
if(dts[i]!=dts[i-1]){
sheet1.getRange(i 1,1,1,5).setBackground('yellow');
}}});
}
SpreadsheetApp.flush();
var from = Session.getActiveUser().getEmail();
var subject = 'Batch Attendance Record for Your Reference';
var body = 'Dear Student,' 'nn' 'Greetings! Please find the batch attendance record attached. Stay safe and blessed.' 'nn' 'Thank you.';
var requestData = {"method": "GET", "headers":{"Authorization":"Bearer " ScriptApp.getOAuthToken()}};
var url = "https://docs.google.com/spreadsheets/d/" ssID "/export?format=xlsxamp;id=" ssID "amp;gid=" shID;
var result = UrlFetchApp.fetch(url , requestData);
var contents = result.getContent();
sss.deleteSheet(sss.getSheetByName('TempDataSet_temp'));
var sheet2 = sss.getSheetByName('StudentList');
var data = sheet2.getLastRow();
var students = [];
var students = sheet2.getRange(2, 6, data).getValues();
//MailApp.sendEmail(students.toString(), subject ,body, {attachments:[{fileName:sheetName ".xlsx", content:contents, mimeType:"MICROSOFT_EXCEL"}]});
for (var i=0; i<students.length; i ){ // you are looping through rows and selecting the 1st and only column index
if (students[i][0] !== ''){
MailApp.sendEmail(students[i][0].toString(), subject ,body, {attachments:[{fileName:sheetName ".xlsx", content:contents, mimeType:"MICROSOFT_EXCEL"}]});
//MailApp.sendEmail(students[i][0].toString(), subject ,body, {from: from, attachments:[{fileName:"YourAttendaceRecord.xlsx", content:contents, mimeType:"MICROSOFT_EXCEL"}]});
}
}
}
Комментарии:
1. это не работает. Пожалуйста, проверьте цветную полосу в наборе TempDataSet на прикрепленном изображении сообщения (измененном), что неверно. И цветная полоса не отображается во вложении почты. Код изменен в соответствии с вашим предложением.
2. @TamjidTaha вы только что изменили картинку… На исходном скриншоте было 5 столбцов, а столбец темы находился в столбце E. И теперь есть 6 столбцов, а столбец темы перемещен в столбец F. Вот почему это не работает. Дайте мне пару минут, и я изменю это. Но, пожалуйста, предоставьте правильное изображение, чтобы не было такой путаницы.
3. это TempDataSet, из которого извлекаются выбранные строки данных. Однако мы удаляем столбцы 2 и 7, а затем отправляем остальные 5 столбцов dataset в виде вложения электронной почты. Пожалуйста, проверьте измененный код в сообщении
4. Я изменил этот код на const subs = sheet.getRange(‘F2:F’ sheet.getLastRow()).getValues().flat(); Он отлично работает в наборе данных TempDataSet, но на листе, который мы отправляем в виде почтового вложения, нет цветной полосы, а полоса набора данных TempDataSet отсутствует.необходимо очистить после отправки электронных писем. Вы знаете, что лист вложений в почту копируется из TempDataSet . Поэтому, пожалуйста, проверьте весь код сообщения еще раз.
5. @TamjidTaha пожалуйста, попробуйте полное решение в моем ответе.