【问题标题】:Google Apps Script FormattingGoogle Apps 脚本格式
【发布时间】:2012-08-19 03:12:59
【问题描述】:

首先为糟糕的礼仪或愚蠢的问题道歉,这是我第一次尝试在谷歌电子表格上编写脚本,我必须说我比在 Excel 中使用 VBA 更困难。反正我的问题;

我有一个四列五十三行的电子表格。列保持;周数(例如 33)、周开始日期(例如 2012 年 8 月 13 日)、工作时间(例如 31:15:00)和应付工资(例如 150.00 美元)。 第一行有标题,第 2 到 53 行是一年中的第几周。 露营太容易了。现在我已经设法编写了一个脚本,运行时会通过电子邮件向我发送一周的摘要电子邮件。我的代码如下;

  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 日星期一”,总工作时间显示时间,支付显示为货币。但是,该脚本不会保留电子表格中的格式。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    Apps 脚本无法获取电子表格可视格式单元格,只能获取它们背后的真实值。有getNumberFormat 方法,您可以在其中获取用户可能已应用于单元格的任何特定格式。但是这种方法不能按预期工作,因为它无法在很多情况下检索正确的格式,例如货币和百分比值,也不会检索默认格式,只有在用户更改它们时才会检索。

    在您的情况下,仅在代码本身中格式化您的值可能更容易,因为您手动连接它们。要格式化日期,您可以使用 Utilities.formatDate,对于数字,您可能可以使用普通的 javascript 函数自行计算,如 num.toFixed() 和一些用于货币符号的字符串连接。

    顺便说一句,我开发了一个脚本,它可以合并邮件并具有这样的格式化功能,你可能会发现它比这个 sn-p 更适合你。它称为 FormEmailer,可在 Script Gallery 和 its site 上找到。

    【讨论】:

    • 谢谢你,Henrique,我已经听从了你的建议,现在得到了想要的结果。非常感谢您的帮助。
    • @megabyte1024 你有没有试过使用这些功能?你会很快发现它们在很多情况下都不够用,它们并不是真正有用的,例如电子表格的默认日期格式是什么(可能配置有不同的语言环境)。还尝试获取货币和百分比格式! getNumberFormat 会丢失所有“默认”格式。只有那些手动应用的是可检索的。不,您绝对从未尝试将 Apps 脚本上的值数组格式化为看起来像电子表格。确实应该有一个方法 getVisualValues 以字符串形式返回所有内容。
    • 第 2 部分。许多人会阅读您的答案,他们会认为确实没有办法获得格式化或非格式化单元格的格式。
    • 我会更新我的答案以避免混淆。但我没有说是不可能得到格式的。我说不可能得到用户在他的屏幕上看到的格式化值。而且我不知道任何可行的解决方法来格式化脚本本身的值。是不可能的。一半的解决方案根本不是解决方案!
    • Henrique Abreu 的观点非常明确。截至今天,没有办法将单元格的格式化值作为字符串获取。这非常令人沮丧!当您开始进一步挖掘时,您会发现 GAS 的各种限制。
    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多