ホーム>source

1つのGMAILメールから3つのCSV添付ファイルをインポートしたい。 添付ファイル名は次のとおりです。-Sales.csv-Labor.csv-ServerPerformance.csv 私はそれが次のようにいくつかの方法で行うことができると信じています:

<前>ウィズウィズ <前>ウィズウィズ

しかし、適切な実行にはいくつかのヘルプを使用できます。

以下は、GMAILラベルとCSV添付ファイル名に基づいてインポートするために現在使用しているスクリプトですが、最初の添付ファイル(Sales.csv)のみをインポートしているため、1つのラベル「South Loop」に3つの個別のラベルを付けたいです1つのメールからGoogleシートにインポートされる添付ファイル。

<前>ウィズウィズ var title = attachment.getName();
あなたの答え
  • 解決した方法 # 1

    あなたが持っている問題は、このステートメント var attachment = message.getAttachments()[0]; のために、最初の添付ファイルだけを見ているということです 。代わりに、 [0] をドロップするだけです  すべての添付ファイルをループします。

    これをより明確にするために、この例のコードを削除しました。後で私のメモも確認してください。

    <前>ウィズウィズ

    ノート:

    カスタム function SLSalesImportFromGmail() { var ss = SpreadsheetApp.getActive(); // Get the spreadsheet file once //gets first(latest) message with set label var threads = GmailApp.getUserLabelByName('South Loop').getThreads(0,1); if (threads && threads.length > 0) { var message = threads[0].getMessages()[0]; // Get all of the attachments and loop through them. var attachments = message.getAttachments(); for (var i = 0; i < attachments.length; i++) { var attachment = attachments[i]; var title = attachment.getName(); // Is the attachment a CSV file attachment.setContentTypeFromExtension(); var table = Utilities.parseCsv(attachment.getDataAsString()); if (attachment.getContentType() === "text/csv") { // Update the specified sheets // Clears the sheet of values & formatting and inserts the new table // using the Apps Script built-in CSV parser. switch (title) { case "Sales.csv": ss.getSheetByName("South Loop Sales").getRange("A:M").clear(); ss.getSheetByName("South Loop Sales").getRange(1, 1, table.length, table[0].length).setValues(table); break; case "Labor.csv": ss.getSheetByName("South Loop Labor").getRange("A:M").clear(); ss.getSheetByName("South Loop Labor").getRange(1, 1, table.length, table[0].length).setValues(table); break; case "ServerPerformance.csv": ss.getSheetByName("South Loop Servers").getRange("A:M").clear(); ss.getSheetByName("South Loop Servers").getRange(1, 1, table.length, table[0].length).setValues(table); break; } } } if (message.getSubject().indexOf('END OF DAY') !== -1) { SLlogTodaysSales(); SLlogTodaysServers(); } if (message.getSubject().indexOf('END OF WEEK') !== -1) { SLlogTodaysSales(); SLlogTodaysServers(); SLlogWeeksLabor(); } // Marks the Gmail message as read, unstars it and deletes it using Gmail API (Filter sets a star) message.markRead(); message.unstar(); Gmail.Users.Messages.remove("me", message.getId()); // Added } } を使用しています  CSVファイルを配列に変換する関数ですが、Googleは既に CSVToArray() でこのためのメソッドを提供しています 。ほとんどの場合、これで十分です。

    両方の Utilities.parseCsv() を呼び出す必要はありません  そして clearContents()clearFormats()  1回の呼び出しで両方を実行します。

    追加のロジックがあることを承知しております(例:「END OF DAY」のメール、および労力とサーバーのパフォーマンスのルールが少し異なります)。前述したように、添付ファイルをループ処理する方法を示すために、これらすべてを削除しました。必ずしも clear() を使用する代わりに、ifまたはswitchステートメントを使用して、そのロジックをスクリプトに含めることができます。  私が書いた閉鎖。

  • 解決した方法 # 2

    だからあなたのコードを見ると、添付ファイルを繰り返し処理しているのを見ることはできません。

    最初のアタッチメントのみを取得し、それを分析して他のユーザーを気にしません。

    <前>ウィズウィズ

    したがって、これを行う代わりに、すべての添付ファイルを updateSheet() で取得します。  そして var attachment = message.getAttachments()[0]; を作ります  ループしてそれらすべてを分析します。

    <前>ウィズウィズ getAttachments()

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ SystemCのデルタサイクルとデルタ通知とは何ですか?