首先为礼仪或愚蠢的问题道歉,这是我第一次尝试使用谷歌电子表格进行脚本编写,我必须说我在excel中比VBA更难挣扎。无论如何我的问题;
我有一个包含四列和五十三行的电子表格。列保持;周数(例如33),周开始日期(例如13/08/12),工作小时数(例如31:15:00)和到期工资(例如150.00美元)。 第一行有标题,第2行到第53行是一年中的几周。 太容易campese了。现在我已经设法编写了一个脚本,运行时会给我发送一周的摘要电子邮件。我的代码如下;
function sendEmail() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Summary");
var startRow = 2; // First row of data to process
var numRows = sheet.getLastRow()-1; // Number of rows to process
// Fetch the range of cells A2:B3
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());
// Fetch values for each row in the Range.
var data = dataRange.getValues()
//Logger.log(data)
for (i in data) {
var row = data[i];
var date = new Date();
var sheetDate = new Date(row[1]);
Sdate=Utilities.formatDate(date,'GMT-1000','w')
SsheetDate=Utilities.formatDate(sheetDate,'GMT-1000', 'w')
//Logger.log(Sdate+' =? '+SsheetDate)
if (Sdate == SsheetDate){
var emailAddress = row[0]; // First column
var weeknum = row[0];
var week = row[1];
var hours = row[2];
var pay = row[3];
var subject = "Timesheet Report for Week " + weeknum;
MailApp.sendEmail('me@myemail.com',
subject,
"Chris, \n\nBased on the timesheet data you have submitted last week So and So has recorded the following hours and should be due the calculated pay.\n\n" +
"Week Beginning; " + week +
"\n\nTotal Hours Worked For The Week; " + hours +
"\n\nPay Due For The Week; " + pay);
//Logger.log('SENT :'+emailAddress+' '+subject+' '+message)
}
}
}
我现在的问题是我希望一周开始显示“8月13日星期一”,显示时间的总工作时间和显示为货币的工资。但是,该脚本不会保留电子表格中的格式。
答案 0 :(得分:4)
在Apps脚本中无法获得电子表格可视化格式化的单元格,只有它们背后的真实值。有getNumberFormat
方法,您可以在其中获取用户可能已应用于单元格的任何特定格式。但是这种方法不能按预期工作,因为它无法在很多情况下检索正确的格式,例如货币和百分比值,也不检索默认格式,仅在用户更改时才会检索。
在您的情况下,可能更容易在代码本身中格式化您的值,因为您手动连接它们。要格式化日期,您可以使用Utilities.formatDate,对于数字,您可以使用普通的javascript函数(num.toFixed()
)和一些字符串连接来处理您的货币符号。
顺便说一下,我开发了一个可以进行邮件合并并具有这种格式化功能的脚本,你可能会发现它比这个片段更适合你。它被称为FormEmailer,可在脚本库和its site上找到。