使用更改日志数据创建阵列并通过电子邮件发送

时间:2016-10-24 12:37:08

标签: google-apps-script google-sheets

我想创建一个脚本,定期收集有关我的电子表格更改的信息,并通过电子邮件发送(例如,每4个小时)。

在其他教程的帮助下,我能够创建这样一个脚本:

function grabData(){
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getActiveSheet()
  var cell = ss.getActiveCell();
  var time = Utilities.formatDate(new Date(),Session.getScriptTimeZone(),'dd-MM-yyyy')+' at '+Utilities.formatDate(new Date(),Session.getScriptTimeZone(),'hh:mm');;
  var dataUser1 = PropertiesService.getScriptProperties().getProperty('contentUser1');
  if(dataUser1==null){dataUser1=''};
  dataUser1+='\nSheet '  +sheet.getName()+' cell '+cell.getA1Notation()+' has been modify at '+time+' (new value = '+cell.getValue()+')';
  PropertiesService.getScriptProperties().setProperty('contentUser1',dataUser1); 
}

function sendReport(){
  var dataUser1 = PropertiesService.getScriptProperties().getProperty('contentUser1');
  if(dataUser1.length >1) {
  MailApp.sendEmail('example@email.com', 'Update of Online orders ', dataUser1);
  PropertiesService.getScriptProperties().setProperty('contentUser1','');
  } 
}

然而,我得到了一个太大的价值" dataUser1错误。

我还尝试构建一个数组来存储每个更改的值描述:

function grabDataTemp()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getActiveSheet()
  var cell = ss.getActiveCell();
  var time = Utilities.formatDate(new Date(),Session.getScriptTimeZone(),'dd-MM-yyyy')+' at '+Utilities.formatDate(new Date(),Session.getScriptTimeZone(),'hh:mm');;
  var changeLog =[];
  var logLength=changeLog.length; 
  if (logLength == null)
  {
    changeLog [0] ='\nSheet '  +sheet.getName()+' cell '+cell.getA1Notation()+' has been modify at '+time+' (new value = '+cell.getValue()+')';
    changeLog [1]="";
  } 
  changeLog [logLength+1] = ('\nSheet '  +sheet.getName()+' cell '+cell.getA1Notation()+' has been modify at '+time+' (new value = '+cell.getValue()+')');
  return changeLog
}

function sendReportTemp(changeLog)
{
  if(changeLog.length >1) 
  {
  MailApp.sendEmail('example@email.com', 'Update of Online orders changeLog-TRIAL ', changeLog)
  changeLog = [];
  } 
}

不幸的是,它似乎也不是一个好的解决方案。可以使用数组以某种方式完成吗?

2 个答案:

答案 0 :(得分:0)

请检查您是否超出Quotas for Google Services中给出的配额或限制。

您可以执行的选项是在发送电子邮件时使用Class MailApp服务。此服务允许用户发送电子邮件,完全控制电子邮件的内容,其唯一目的是发送电子邮件。

尝试浏览文档以获取有关可用方法和可尝试的示例代码的更详细信息。

除此之外,您还可以查看G Suite email sending limits。它也可能有所帮助。

答案 1 :(得分:0)

使用scriptProperties的第一个解决方案确实受到这些属性可以具有的字符串长度的限制。

工作表解决方案应该可行,我建议编写一个脚本,将工作表内容转换为html表,使其更具可读性。

在单个列中为每个更改使用一行,以使下面的代码无需任何更改即可运行。

代码示例:

function sendReport(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var errorMsg = ss.getDataRange().getValues();
  var message = '<body><div style="font-family:arial,sans;font-size:12pt"><p>Change report</p>';  
  message+= '<table style="background-color:#fafafa;border-collapse:collapse;font-family:arial,sans;font-size:9pt;" border = 1 cellpadding = 5>';
  message+='<tr valign="top" bgcolor="#FFA" cellpadding=5><th>Number</th><th>description</th></tr>';
  var c = 1;//counter
  for(var n=0;n<errorMsg.length;n++){
    message+='<tr><td align="center">'+c+'</td><td>';
    message+=errorMsg[n][0]+'</td></tr>';
    c++;
  }
  message+='</table></body>'
  var hh = 100+35*errorMsg.length;
  if(hh>500){hh=500};
  var render = HtmlService.createHtmlOutput(message).setWidth(940).setHeight(hh);
  SpreadsheetApp.getUi().showModelessDialog(render, "preview");  
  MailApp.sendEmail(Session.getActiveUser().getEmail(),'change log','HTML ONLY',{'htmlBody':message})
}

enter image description here