Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Google应用程序脚本从数据透视表中以pdf或excel格式附加详细信息表?_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 如何使用Google应用程序脚本从数据透视表中以pdf或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格式将详细信息表手动发送到学生的电子邮件地址。现在整个过程可以用谷歌应用程序脚本自动完成了吗 或流程

我有学生出勤制度。它在来自TempDataSet选项卡的透视表的计数列中有一个计数值,即每个学生的出勤率。我的期望可以通过以下两种方式之一实现:

Process 01:当我在仪表板中单击数据透视表的计数列的任何单元格时,它会手动生成以下人员的出勤详细信息: 数据来自“TempDataSet”的学生,比如他/她参加了一个 班级。然后表名就是细节-abc@gmail.com. 然后我可以发送 以pdf格式将详细信息表手动发送到学生的电子邮件地址。现在整个过程可以用谷歌应用程序脚本自动完成了吗

或流程02:根据学生电子邮件ID拆分TempDataSet(与所附图像的模式相同)选项卡,并通过电子邮件将其作为附件单独发送给学生。然而,我有50-60名学生在一个班级,所以所有的工作都应该通过从仪表板上单击来完成,现在工作正常,但问题是它将整个TempDataSet选项卡发送给所有学生,而不是拆分TempDataSet信息并发送每个学生特定的信息

以下代码适用于单页选项卡下载,并以excel附件的形式发送电子邮件(将所有学生的出勤信息以单页形式发送给所有学生):

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工作表中选择特定学生,并将其复制到 临时工作表名为
    temp\u sh
    。最后,后者通过电子邮件发送 向特定学生发送excel文件

  • 值得一提的是,
    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"}]});
    
    });
    
    }