如何修改现有的电子邮件CSV脚本以跳过空白行或在任何字段中具有单个零的行

How can I modify the existing email CSV script to skip blank rows, or rows with a single zero in either field?

本文关键字:空白 单个零 字段 任何 脚本 修改 何修改 CSV 电子邮件      更新时间:2023-09-26

我一直在使用谷歌提供的脚本从谷歌表格生成和发送csv。我对它进行了定制,这样它就不会要求输入范围或文件名。这样,它就会定期自动给我发邮件,告诉我范围的内容。

问题是CSV包含空行,最后,我希望脚本自动过滤掉(我无法实现,因为我只是没有知识)。反过来,这样做的原因是范围包含空行-但这有一个很好的理由,即范围中的行有时会扩展,有时会收缩,这取决于底层数据。(这个范围实际上与数据透视表有关)。

作为额外奖励,我还希望它跳过行,如果行中两列中的任何一列都有一个零。(我应该能够在数据透视表中过滤掉这个;我可以,但是如果出现新值,过滤器就不能正常工作了。

这是我的电子邮件CSVs的一个例子:

0,0
,0
0.65,0
0.75,16900
0.78,2000
0.79,500
0.8,110800
0.83,1200
0.85,20000
0.87,4500
0.9,3500
1,5000
1.1,4000
1.2,41500
,
,
,
,
,
,
,
,
,
,
,
,
,
,

这是一个我希望如何接收CSV的示例:

0.75,16900
0.78,2000
0.79,500
0.8,110800
0.83,1200
0.85,20000
0.87,4500
0.9,3500
1,5000
1.1,4000
1.2,41500

任何帮助,这将是非常感激。谢谢。

这是我目前使用的脚本:

var settings = {
  "recipients": "myemailaddress",
  "emailSubject": "CSV file",
  "emailMessage": "Your CSV file is attached",
  "fileExtension": ".csv",
  "carriageReturn": "'r'n"
};
function onOpen() {
  var subMenus = [];
  subMenus.push({name: "Email Named Range as CSV", functionName: "run"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("CSV", subMenus);
}
function run() {
  /var namedRange = Browser.inputBox("Enter named range to convert to CSV (e.g. sampleDataRange):");/
  var namedRange = "FORCSVEXPORT";
  var fileName = "EPCSELLOFFERS.CSV";
  if (namedRange.length !== 0 && fileName.length !== 0) {  
    settings.dataRangeName = namedRange;
    settings.csvFileName = fileName + settings.fileExtension;
    var csvFile = convertNamedRangeToCsvFile_(settings.dataRangeName, settings.csvFileName);
    emailCSV_(csvFile);
  }
  else {
    Browser.msgBox("Error: Please enter a named range and a CSV file name.");
  }
}
function emailCSV_(csvFile) {
  MailApp.sendEmail(settings.recipients, settings.emailSubject, settings.emailMessage, {attachments: csvFile});
}
function convertNamedRangeToCsvFile_(rngName, csvFileName) {
  var ws = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(rngName);
  try {
    var data = ws.getValues();
    var csvFile = undefined;
    if (data.length > 1) {
      var csv = "";
      for (var row = 0; row < data.length; row += 1) {
        for (var col = 0; col < data[row].length; col += 1) {
          if (data[row][col].toString().indexOf(",") != -1) {
            data[row][col] = "'"" + data[row][col] + "'"";
          }
        }
        // Join each rows columns
        // Add carriage return to end of each row
        csv += data[row].join(",") + settings.carriageReturn;
      }
      csvFile = [{fileName: csvFileName, content: csv}];
    } 
    return csvFile;
  }
  catch(err) {
    Logger.log(err);
    Browser.msgBox(err);
  }
}

与其破解原始的convertNamedRangeToCsvFile_(),我建议在run()中添加一个额外的步骤,该步骤将调用一个新函数从csv文件中删除不需要的行。

/**
 * Remove unwanted lines from given csvFile
 */
function minimizeCsvFile( csvFile ) {
  // take apart the csv file contents, into an array of rows
  var rows = csvFile[0].content.replace(/'r'n/g, "'n").split("'n");
  var newRows = [];
  for (var i = 0; i < rows.length; i++ ) {
    if (rows[i] == "") continue;   // skip blanks
    if (rows[i] == ",") continue;  // skip null values
    // skip rows with either numeric value == 0
    var vals = rows[i].split(",");
    if (parseFloat(vals[0]) == 0.0 || parseFloat(vals[1]) == 0.0) continue;
    // If we got here, we have a keeper - add it to newRows
    newRows.push(rows[i]);
  }
  debugger;   // pause to observe in debugger
  var csv = newRows.join(settings.carriageReturn);
  // Return a single element array with an object, exactly like
  // the one from convertNamedRangeToCsvFile_.
  return [{fileName: csvFile[0].fileName, content: csv}];
}

要使用它,将run()中的emailCSV_()行更改为:

var minimizedCsvFile = minimizeCsvFile(csvFile);
emailCSV_(minimizedCsvFile);

至于这个…

作为奖励…任何帮助,这将是非常感激。谢谢。

我们想要的只是让StackOverflow的新成员在收到帮助时表示感谢!看看这个答案,看看如何接受答案。(你可以通过提问、回答和接受回答来建立信誉!)

但我一直想要一辆法拉利…