0

Google 提供のスクリプトを使用して、Google スプレッドシートから CSV を生成してメールで送信しています。範囲やファイル名を要求しないようにカスタマイズしました。このようにして、範囲の内容を定期的に自動的にメールで送信します。

問題は、CSV に最後に空の行が含まれていることです。これは、スクリプトで自動的に除外する必要があります (知識がないため、達成できません)。この理由は、範囲に空の行が含まれているためですが、これには正当な理由があります。これは、基になるデータに応じて、範囲内の行が拡大したり、縮小したりすることがあるためです。(実際には、範囲はピボット テーブルに関連しています)。

おまけとして、行の 2 つの列のいずれかにゼロが 1 つある場合は、行をスキップすることもできます。(ピボット テーブルでこれを除外できるはずです。できますが、新しい値が表示されると、フィルターが正しく機能しません)。

これは、メールで送信された CSV が現在どのように表示されているかの例です。

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);
  }
}
4

1 に答える 1

1

元の をハックするのではなく、 csv ファイルから不要な行を削除する新しい関数を呼び出すconvertNamedRangeToCsvFile_()追加のステップを に追加することを提案します。run()ここにあります:

/**
 * 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}];
}

それを利用するには、emailCSV_()行を次のように変更run()します。

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

そしてこれに関しては…

ボーナス賞品として...これに関するヘルプは非常に高く評価されます. ありがとう。

ここで私たちが望んでいるのは、StackOverflow の新しいメンバーが助けを受け取ったことを認めてくれることだけです! 回答を受け入れる方法のヒントについては、この回答をご覧ください。(質問して、答えて、受け入れることで、レップを構築できます!)

でもずっと欲しかったフェラーリ…

于 2013-04-12T20:10:49.563 に答える