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

Google apps script 使用更改日志数据创建阵列并通过电子邮件发送,google-apps-script,google-sheets,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

我想创建一个脚本,定期收集有关电子表格更改的信息,并通过电子邮件发送(例如,每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 = [];
  } 
}

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

请检查您是否超过中给出的配额或限制

您可以选择在发送电子邮件时使用服务。该服务允许用户发送电子邮件,并完全控制电子邮件内容,其唯一目的是发送电子邮件

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


除此之外,您还可以检查。这可能也有帮助。

请检查您是否超过了中给出的配额或限制

您可以选择在发送电子邮件时使用服务。该服务允许用户发送电子邮件,并完全控制电子邮件内容,其唯一目的是发送电子邮件

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


除此之外,您还可以检查。这可能也有帮助。

您的第一个使用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})
}
函数sendReport(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var errorMsg=ss.getDataRange().getValues();
风险值消息=“变更报告”

”; 消息+=''; 消息+='Numberdescription'; var c=1;//计数器 对于(var n=0;n500){hh=500}; var render=HtmlService.createHtmlOutput(message).setWidth(940).setHeight(hh); SpreadsheetApp.getUi().showModelessDialog(呈现“预览”); MailApp.sendEmail(Session.getActiveUser().getEmail(),'change log','HTML ONLY',{'htmlBody':message}) }

您的第一个使用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})
}
函数sendReport(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var errorMsg=ss.getDataRange().getValues();
风险值消息=“变更报告”

”; 消息+=''; 消息+='Numberdescription'; var c=1;//计数器 对于(var n=0;n500){hh=500}; var render=HtmlService.createHtmlOutput(message).setWidth(940).setHeight(hh); SpreadsheetApp.getUi().showModelessDialog(呈现“预览”); MailApp.sendEmail(Session.getActiveUser().getEmail(),'change log','HTML ONLY',{'htmlBody':message}) }

您知道是什么原因导致了错误吗?是有人在单元格中粘贴了大量文本还是导入了csv之类的内容?记录了很多更改。当记录了大约84个事件时发生错误。字符总数9170您知道是什么原因导致了错误吗?是有人在单元格中粘贴了大量文本还是导入了csv之类的东西?记录了很多更改。当记录了大约84个事件时发生错误。字符总数9170