0

Google アプリ スクリプトは初めてで、基本的な HTML 以外の種類のスクリプトについての予備知識はありません。ただし、このフォーラムのおかげで、Google App スクリプトはあまり問題になりませんでした。

私はデータ アナリストであり、Web サイト パブリッシャー向けの基本的なビッグ データの利点のいくつかをエミュレートするための低コスト/オープン ソースの方法を研究しています。私の探求は、私を Google スクリプトに導きました。1週間前に知って以来、いくつか書くことができました。

客観的な課題は次のとおりです。

  1. IMPORTHTML 関数を使用して約 1000 行を動的に取得するスプレッドシートがあります。ソースが毎日更新されると範囲が自動的に更新されるため、前日のデータは失われます。そのため、選択した時間範囲で履歴データを分析できるように、アーカイブ シートにデータをバックアップする必要があります。

  2. 行を自動的にコピーし、アーカイブ シートの上部の範囲ヘッダーのすぐ下に貼り付けて、データ分析に必要な日付でアーカイブを並べ替える必要がないようにしたいと考えています。また、念のため、重複行を確認して削除する必要があります。

最初に、アーカイブされた範囲の最後の行の下にコピーされた行を追加するスクリプトを作成しました。ただし、高度な分析のために特定の日付範囲 (たとえば 14 日または 7 日) でデータをフィルター処理する必要があったため、日付による並べ替えが必要になりました。そこで、並べ替え用のスニペットと、重複を削除するためのスニペットを追加しました。うまく機能しますが、ソートには時間がかかります。また、毎日何千もの新しい行が追加されることを考えると、さらに時間がかかります。よりスマートなソリューションが必要でした。

そこで、(1) ソース範囲の行数を検出し、(2) アーカイブ シートのヘッダーの下にできるだけ多くの行を挿入し、(3) コピーした範囲を新しく挿入された行に貼り付けるスクリプトを書き始めました。

書き終えましたが、非常に高速に動作します。どうやらソートは必要ありません。しかし、それをさらに迅速かつスマートに、将来を見据えたものにする方法があるかどうか疑問に思っていました. 以下のコードを見つけてください。どんな提案でも大歓迎です。

function myFunction() {


  //1. Get data from source sheet of a spreadsheet whose id is known, we will also need the data range's last row number

  var firstStep = SpreadsheetApp.openById("ID of Source Spreadsheet");
  var ss = firstStep.getSheetByName("Sheet1");
  ss.activate();
  var myRange = ss.getRange(4, 2, ss.getLastRow() - 3, ss.getLastColumn());
  var myData = myRange.getValues();


  //'3' subtracted from last row data collector above as first three rows contain static data or blank row in my source sheet. Applied same technique at line 17 below as well. This totally depends on how you position the source range in the source sheet. For exaple, for a range starting at 1,1 on any sheet, no such subtraction woud be required.

  var lastRow = myRange.getLastRow() - 3;


  //2. Open archive spreadsheet, select the destination sheet, insert exact number of rows of source range and then paste copied range. 

  var secondStep = SpreadsheetApp.openById("ID of archive spreadsheet");
  var newSS = secondStep.getSheetByName("dump1");
  newSS.activate();


  //2.a  Insert Rows as in #lastrow in the new sheet, just below the header at Row 1

  newSS.insertRowsBefore(2, lastRow)


  //2.b Paste values

  newSS.getRange(2, 1, myData.length, myData[0].length).setValues(myData);


  //2.c Paste last row number of the copied range in another cell of the same sheet, optional step, just to be sure that last row determination process is right. You may remove this step if you like.  

  newSS.getRange(1, 15).setValue(lastRow);

  /*   
   //3.a Optional: Script to remove duplicate rows in archive sheet. Will increase the script-run duration considerably. 
   
   var data = newSS.getDataRange().getValues();
   var newData = new Array();
   for(i in data){
     var row = data[i];
     var duplicate = false;
     for(j in newData){
       if(row.join() == newData[j].join()){
         duplicate = true;
       }
     }
    if(!duplicate){
       newData.push(row);
     } 
   }
   newSS.clearContents();
   newSS.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
   
   */

}

4

1 に答える 1

0

Google アプリ スクリプト自体で実行できることは、スプレッドシート、ドキュメント、サイトなどへのリクエストなど、Google のサーバーや外部サーバーからデータを取得する必要がある呼び出しを行うよりもはるかに高速です。スクリプトがこれらのサービスに対して行う呼び出しを最小限に抑える方法を見つけることができれば、スクリプトはより高速に実行されます。

スクリプトを高速化するには、1 つのコマンドですべてのデータを配列に読み取り、配列内のデータに対して任意の操作を実行して、1 つのコマンドでデータを書き出します。

次に例を示します。

var cell = sheet.getRange('a1');
var colors = new Array(100);
for (var y = 0; y < 100; y++) {
xcoord = xmin;
colors[y] = new Array(100);
for (var x = 0; x < 100; x++) {
colors[y][x] = getColor_(xcoord, ycoord);
xcoord += xincrement;
}
ycoord -= yincrement;
}
sheet.getRange(1, 1, 100, 100).setBackgroundColors(colors);

Google のベスト プラクティスを使用する必要があります。Google のリストのハイライトは次のとおりです。

  • API 呼び出しの数を減らす
  • API 呼び出しを行うときは、リクエストをバッチ処理します
  • Apps Script 組み込みのキャッシュ サービスを使用する
  • UIApp を使用しないでください。HTML サービスを使用する

スクリプトのパフォーマンスを向上させるのに役立つドキュメント リストのベスト プラクティスを次に示します: https://developers.google.com/apps-script/best_practices#minimize-calls-to-other-services

于 2016-05-22T15:26:24.667 に答える