Googleドキュメント(ドライブ)のレターの郵送

統計を作成し、メーリングリストを管理する

FormEmailerに基づいた(異なるアカウントからの)Googleドキュメントで





Big Brother Ltd.は 、スクリプト(FormEmailerテンプレート)を使用して配布結果の統計を作成することにしました 。 どのように行われたかを説明します。



好奇心の強い人のために、私たちが何を目指しているかをすぐに紹介します。

次のようになります。







図1:開発の最終ビュー。



それでは、楽しい部分である実装に取り​​かかりましょう。

ニュースレターを使用するには、スクリプト-FormEmailerテンプレートを使用します。 多機能であり、構成が柔軟であり、ほとんど労力を費やすことなく、本当に強力なツールになります。

Googleドキュメントで「ニュースレター」テーブルを作成します。

[挿入]-> [スクリプト]をクリックし、hgabreuからFormEmailerを見つけて、[インストール]をクリックします。 ログインして、カレンダーを使用する権利を与えます。



インストール後、メニュー項目のフォーム電子メールが表示されます。





クリックすると、メニューにインストールが表示されます。 クリックすると、言語を選択できるフォームとデータのリストが表示されます(ここで、郵送のベースを収集します)。

私は予約をします。ニュースレターの基本では、私たちは購読者のみを含めます。



また、Googleテーブルの制限の詳細を考慮することも重要です。 したがって、このセクション を読む ことを強くお勧めします。



重要:エラーや問題なしですべてを作成するには、シートに少なくとも列名が含まれている必要があります(ヘッダーを持っている)。



メーリングベースが数千を超える場合は、追加のアカウントを使用し、それらで同じ操作を行う必要があります。

インストールに問題がある場合は、プログラムのWebサイトにアクセスしてください。 サイト



その結果、Gmailアカウントの使用を1日あたり500文字に制限した大量メール送信ツールを入手できます。 禁止されるリスクがあるため、上限を使用しないことをお勧めします。



これが私たちのドキュメントの見た目です:





図2:シートビュー

1.-シート「データ」; 2.-シート「FormEmailer」。 3.-シート「05/2012」。 4.-シート「レポート」。



作成時に、インストールから2つのタブを取得します。

1)データは私たちのデータベースです。 このドキュメントをメーリングリストとして使用します。

2)FormEmailer-テンプレートと基本的なメール設定。



別のシート「レポート」を作成し、プログラムを使用してアーカイブシートを作成します。 すべての出荷レポートを収集します。





それでは、FormEmailerというスクリプトを用意していきましょう。 バージョンは関係ありません。



スクリプトエディターを開くと、FormEmaileraコードが開きます。

Ctrl + Fを使用して、関数processManuallyを見つけ、その前にコードを記述します。

すべてが機能するためには、コードは私のものと同じでなければなりません。



このコードは、「05/2012」の形式で現在の月と年の名前を含むアーカイブシートをドキュメントに追加します-月/年。







var thisMonth = Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "MM/yyyy"); var outputSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(thisMonth); if ( !outputSheet ) { SpreadsheetApp.getActiveSpreadsheet().insertSheet(thisMonth); var outputSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(thisMonth); }
      
      







送信された手紙のカウンターを追加します。







 var count_send_email = 0;
      
      







列のセルに日付を作成し、統計データを担当するテキストのカウントとコメントのためにアーカイブにコピーします。







 var thisDate_send_email = Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "MM/dd/yyyy"); var time_send_email = Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "MM/dd/yyyy hh:mm:ss"); c.fs.getRange(line,1).setValue("Email sent, " + time_send_email); c.fs.getRange(line,2).setValue(thisDate_send_email); var dataHeight = c.fs.getDataRange().getHeight(); var dataWidth = c.fs.getDataRange().getWidth(); // Check if there free rows in the output sheet if(outputSheet.getDataRange().getHeight()==outputSheet.getMaxRows()) outputSheet.insertRowAfter(outputSheet.getMaxRows()); Logger.log("height:"+outputSheet.getDataRange().getHeight()); Logger.log("max: "+outputSheet.getMaxRows()) count_send_email++; c.fs.getRange(line, 1, 1, dataWidth).moveTo(outputSheet.getRange(outputSheet.getDataRange().getHeight()+1, 1)); c.fs.deleteRow(line); } catch(e) { status.push(repl_(T.statusError, s.qtt == 1 ? '' : i+1, e)); c.err.push(repl_(T.mailError, s.qtt == 1 ? '' : i+1, e, line)); } } else { status.push(T.statusQuota); if( c.err.length == 0 || !startsWith_(c.err[c.err.length-1], T.statusQuota) ) c.err.push(t.statusQuota+'. '+new Date()); break; } } outputSheet.getRange(outputSheet.getLastRow(),5).setValue(count_send_email); /* c.fs.getRange(line,1).setValue(status.join('; ')); if( c.fl && line != 2 ) { if( s.closure === 'values' ) all.setValues([values]); else if( s.closure === 'clear' ) all.clearContent(); //else formulas > just leave them there }*/
      
      







スクリプトの記述の詳細については説明しません。

質問がある場合は、書いてください-私たちは答えます。

これで、FormEmailer-aが完成しました。



統計を始めましょう。



統計が収集されるファイルを作成します。



次に、サマリーテーブル「レポート」をサマリードキュメントの統計にコピーする必要があります。



これを行うには、FormEmaileraスクリプトで新しいupdateData関数を作成します。

コードの最後、およそ1164行目で、前の関数の閉じ括弧の後、以下を追加します。

 var SOURCE_SPREADSHEET_ID = " ,    "; var SOURCE_SHEET_NAME = "  "; var DESTINATION_SPREADSHEET_ID = " ,   "; var DESTINATION_SHEET_NAME = " ,   "; function updateData() { try { var sourceSheet = SpreadsheetApp.openById(SOURCE_SPREADSHEET_ID).getSheetByName(SOURCE_SHEET_NAME); if(sourceSheet!=null) { var sourceData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SOURCE_SHEET_NAME).getDataRange().getValues(); var destinSheet = SpreadsheetApp.openById(DESTINATION_SPREADSHEET_ID).getSheetByName(DESTINATION_SHEET_NAME); if(destinSheet!=null) destinSheet.getRange(1, 1, sourceData.length, sourceData[0].length).setValues(sourceData); else throw new Error("Destination sheet not found."); } else throw new Error("Source sheet not found."); } catch(e) { Logger.log(e.message); Browser.msgBox(Logger.getLog()); } }
      
      







要約統計シートが最終形式になるように、送信済み/送信待ちのカテゴリの文字数を収集するための式を書き留めます。



送信済み:

=(ARRAYFORMULA(SUMIF('05 / 2012 '!$ B:$ B、$ A2、'05 / 2012'!$ E:$ E)))



式を解読します。



ARRAYFORMULA-「1つのセル内」の配列数式を使用すると、出力ではなく配列の入力を使用して数式を記述できます。

SUMIF-合計IF(範囲;基準; total_range)

範囲-シート05/2012列B、式が「プルダウン」によって伝播されるときに$記号はこの列を修正します(つまり、各セルに$ B:$ B; $ B:$ B; $ B:$ Bの範囲があります。 $がなかった場合、B:B; C:C; D:Dのようになります(この場合、これは日付です)。

$ A2は、合計を実行する基準です。この場合、2012年5月1日などです。

重要:すべての計算を正しく行うには、必要な基準のタイプが同じである必要があります。 つまり、2012年5月1日までに選択した場合、これは2012年1月5日と同じではなく、MM / DD / YYYYはDD / MM / YYYYと等しくありません。

total_range-'05 / 2012 '!$ E:$ E-計算を行う列(この場合、これは文字数です)。



期待:

= COUNTIF( 'Data'!C:C、 "* @ *")

式をデコードします-COUNT IF(「データ」シートの列Cには、@という内容のテキストがあります)

数式の詳細



Googleスプレッドシート機能リスト





1つの問題があります。すべての列に数式を記​​述すると、すべての列に同じ数字が表示され、日付に関連付けられた実際の数字が必要になります。





送信待ちの文字を正しく処理するには、番号を日付にバインドする必要があります。式を操作するときは、受信した値のみを残します。 以下のコードはこの問題を解決します。





 var thisDay = Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "dd"); var myArray_Date = new Array(); myArray_Date = [1,2,3,4,7,8,9,10,11,14,15,16,17,18,21,22,23,24,25,28,29,30,31]; var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Report"); for (var date_count = 0; date_count < 30; date_count++) { if (myArray_Date[date_count]==thisDay) { var y = myArray_Date[date_count] + 1; dataSheet.getRange(y, 3).setFormula("=COUNTIF('Date'!C:C, \"*@*\")"); } } var datatocopy = dataSheet.getRange(y, 3).getValues(); dataSheet.getRange(y, 3).setValues(datatocopy);
      
      





それでは、統計の形成を始めましょう。

統計を生成するためのドキュメントがありますが、完全に生成するには、そのようなドキュメントが1つではなく、いくつか必要です。

しかし、今のところは、持っている1つのドキュメントのみから始めます。

フォーメーションには式を使用します。



合計数のページを作成します。



図3.確認したい統計。

作業を高速化するために、2つのシートからデータを収集するスクリプトを作成します。

 function myFunction() { var workSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("REPORT"); var rew; var myReport_Name = new Array(); var first_work_row = 3, last_work_row = 33, count_column = 2; workSheet.getRange("B" + first_work_row + ":F" + last_work_row).clearContent(); for (var i=first_work_row; i<=last_work_row; i++) { rew = i - 1; workSheet.getRange(i, 2).setFormula("=(ARRAYFORMULA(SUMIF('  '!$A:$A&'  '!$A$1; $A" + i + "&$B$1; '  '!B:B)))"); workSheet.getRange(i, 3).setFormula("=(ARRAYFORMULA(SUMIF('  '!$A:$A&'  '!$A$1; $A" + i + "&$B$1; '  '!C:C)))"); workSheet.getRange(i, 4).setFormula("=Report_!F" + rew); workSheet.getRange(i, 5).setFormula("=Report_!E" + rew); workSheet.getRange(i, 6).setFormula("=Report_!D" + rew); } }
      
      





メニューにボタンを表示するには、小さなコードを追加します:

 function onOpen() { SpreadsheetApp.getActiveSpreadsheet().addMenu("?", [{name: "!", functionName: "myFunction"}]); }
      
      







これで、カウントする必要があるたびにスクリプトを入力する必要がなくなりました。 「Dig」ボタンをクリックして、結果を待ちます。



スクリプトを起動するプロセスを自動化するために、スクリプトエディターで構成されているトリガーを使用することもできます(リソース-現在のスクリプトのトリガー)。



このようなテーブルが表示されたら、「追加」リンクをクリックして、次のパラメーターを設定します。



これで、2時間ごとに参加せずにスクリプトが自動的に実行されます。 さまざまな方法で構成できます。



数式は手動で作成できますが、シートが複数あり、20枚以上ある場合、同じ数式をコンパイルするときに間違いを犯す可能性があります。



スクリプトに欠けている唯一のものは、「値のみ」パラメータです。これは、式を使用してドキュメントをロードしないために必要です。



アカウントと条件を含むテーブル- アカウント

要約表-要約



これらの統計の唯一のマイナスは、日付を手動で設定する必要があることです。 誰かが、週末を除いて、日付スタンプのプロセスの自動化を提供する場合、私たちはあなたの助けに感謝します。



オンラインアクセスで統計を整理する方法については、それだけです。



ファイルを使用し、勉強し、友人とリンクを共有します。

フィードバックを待っています。



よろしく、アントン。



All Articles