Javascript 如何使用Google应用程序脚本从数据透视表中以pdf或excel格式附加详细信息表?
我有学生出勤制度。它在来自TempDataSet选项卡的透视表的计数列中有一个计数值,即每个学生的出勤率。我的期望可以通过以下两种方式之一实现: Process 01:当我在仪表板中单击数据透视表的计数列的任何单元格时,它会手动生成以下人员的出勤详细信息: 数据来自“TempDataSet”的学生,比如他/她参加了一个 班级。然后表名就是细节-abc@gmail.com. 然后我可以发送 以pdf格式将详细信息表手动发送到学生的电子邮件地址。现在整个过程可以用谷歌应用程序脚本自动完成了吗 或流程02:根据学生电子邮件ID拆分TempDataSet(与所附图像的模式相同)选项卡,并通过电子邮件将其作为附件单独发送给学生。然而,我有50-60名学生在一个班级,所以所有的工作都应该通过从仪表板上单击来完成,现在工作正常,但问题是它将整个TempDataSet选项卡发送给所有学生,而不是拆分TempDataSet信息并发送每个学生特定的信息 以下代码适用于单页选项卡下载,并以excel附件的形式发送电子邮件(将所有学生的出勤信息以单页形式发送给所有学生):Javascript 如何使用Google应用程序脚本从数据透视表中以pdf或excel格式附加详细信息表?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有学生出勤制度。它在来自TempDataSet选项卡的透视表的计数列中有一个计数值,即每个学生的出勤率。我的期望可以通过以下两种方式之一实现: Process 01:当我在仪表板中单击数据透视表的计数列的任何单元格时,它会手动生成以下人员的出勤详细信息: 数据来自“TempDataSet”的学生,比如他/她参加了一个 班级。然后表名就是细节-abc@gmail.com. 然后我可以发送 以pdf格式将详细信息表手动发送到学生的电子邮件地址。现在整个过程可以用谷歌应用程序脚本自动完成了吗 或流程
function autoEmailing(){
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: 3, ascending: true});
var columns_delete = [7,5,4,2];
columns_delete.forEach(col=>sheet1.deleteColumn(col));
var subject = 'Your Attendance Record at BDU';
var body = 'Dear Student,'+ '\n\n' + 'Greetings! Please find the attendance record attached for your reference.' + '\n\n' + 'Thank you.';
var requestData = {"method": "GET", "headers":{"Authorization":"Bearer "+ScriptApp.getOAuthToken()}};
var url = "https://docs.google.com/spreadsheets/d/"+ ssID + "/export?format=xlsx&id="+ssID+"&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"}]});
}
}
函数自动发送电子邮件(){
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_值,false);
sheet.getDataRange().copyTo(sheet1.getActiveRange(),
SpreadsheetApp.CopyPasteType.PASTE_格式,false);
var shID=sheet1.getSheetId().toString();
sheet1.getRange(2,1,sheet.getLastRow()-1,
sort({column:3,升序:true});
var列_delete=[7,5,4,2];
columns_delete.forEach(col=>sheet1.deleteColumn(col));
var subject='您在BDU的出勤记录';
var body='亲爱的学生,'+'\n\n'+'您好!请查找随附的考勤记录,以供参考。'+'\n\n'+'谢谢';
var requestData={“方法”:“获取”,“头”:{“授权”:“承载者”+ScriptApp.getOAuthToken()};
变量url=”https://docs.google.com/spreadsheets/d/“+ssID+”/export?format=xlsx&id=“+ssID+”&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学生=[];
var students=sheet2.getRange(2,6,data).getValues();
//MailApp.sendmail(students.toString(),主题,正文,{附件:[{fileName:sheetName+“.xlsx”,content:contents,mimeType:“MICROSOFT_EXCEL”}]});
对于(var i=0;隔离
你不能用“双击”按钮自动获取细节。那么这个解决方法呢
通过应用程序脚本构建细节
由于您是按电子邮件地址筛选的,因此很容易根据源数据获得筛选的详细信息报告。首先,您将使用“数据透视表电子邮件地址”列筛选数据,然后您将使用筛选的行和列构建临时工作表
以下是此脚本如何工作的示例:
函数sendEmails(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var pivot=ss.getActiveSheet();//您将在pivot表仪表板中启动脚本
var from=Session.getActiveUser().getEmail();//获取执行脚本的活动用户的电子邮件地址
var db=ss.getSheetByName(“数据库”);//透视表源数据表
var emails=pivot.getRange(“A2:A”).getValues();//包含电子邮件地址的pivot表列
emails.forEach(email=>{
var filteredRows=db.getDataRange().getValues().filter(行=>行[6]==电子邮件[0]);//使用每个电子邮件地址筛选数据库
var temp=ss.insertSheet(“TempDataSet_temp”);//创建临时工作表
temp.appendRow([“Timestamp”,“StudentID Name”,“Umail”,“…”]);//填充报告的标题
filteredRows.forEach(row=>temp.appendRow(row));//将筛选的行追加到临时工作表
var subject='您在BDU的出勤记录';
var body='亲爱的学生,'+'\n\n'+'您好!请查找随附的考勤记录,以供参考。'+'\n\n'+'谢谢';
var requestData={“方法”:“获取”,“头”:{“授权”:“承载者”+ScriptApp.getOAuthToken()};
变量url=”https://docs.google.com/spreadsheets/d/“+ss.getId()+”/export?format=xlsx&id=“+ss.getId()+”&gid=“+temp.getSheetId()”;
var result=UrlFetchApp.fetch(url,requestData);
var contents=result.getContent();
ss.deleteSheet(temp);//导出电子表格后,我将删除临时工作表以备将来操作
MailApp.sendEmail(电子邮件[0],主题,正文,{from:from,附件:[{fileName:“youratendacerecord.xlsx”,content:contents,mimeType:“MICROSOFT_EXCEL”}]});//将电子邮件发送给正确的收件人及其相关报告
});
}
工具书类
说明:
- 以下脚本在数据透视表(仪表板)和
对于每个学生的电子邮件,它会过滤相关数据
从TempDataSet工作表中选择特定学生,并将其复制到
临时工作表名为
。最后,后者通过电子邮件发送 向特定学生发送excel文件temp\u sh
- 值得一提的是,
在这个场景中是非常必要的,因为脚本不断地创建和删除数据Spreadsheet.flush()
function emailSender(){ const ss = SpreadsheetApp.getActive(); const sh_db = ss.getSheetByName('Dashboard'); const sh_tds = ss.getSheetByName('TempDataSet'); const u_emails = sh_db.getRange('A13:A57').getValues().flat(); // adjust this to your specific range const data = sh_tds.getRange('A1:G'+sh_tds.getLastRow()).getValues(); const subject = 'Your Attendance Record at BDU'; const body = 'Dear Student,'+ '\n\n' + 'Greetings! Please find the attendance record attached for your reference.' + '\n\n' + 'Thank you.'; const from = Session.getActiveUser().getEmail(); const requestData = {"method": "GET", "headers":{"Authorization":"Bearer "+ScriptApp.getOAuthToken()}}; const ssID = ss.getId(); u_emails.forEach(e=>{ var temp_data = data.filter( row => { return (row[2] == e || row[2] == 'Umail'); }); var temp_sh = ss.insertSheet('temp_sheet'); temp_sh.getRange(1,1,temp_data.length,temp_data[0].length).setValues(temp_data); SpreadsheetApp.flush(); var shID = temp_sh.getSheetId(); var url = "https://docs.google.com/spreadsheets/d/"+ ssID + "/export?format=xlsx&id="+ ssID +"&gid="+shID; var result = UrlFetchApp.fetch(url , requestData); var contents = result.getContent(); ss.deleteSheet(temp_sh); GmailApp.sendEmail(e, subject ,body, {from: from, attachments:[{fileName:"YourAttendaceRecord.xlsx", content:contents, mimeType:"MICROSOFT_EXCEL"}]}); }); }