0

私はGoogle Appのスクリプティングが初めてです。基本的なHTML以外のあらゆるタイプのスクリプトについての事前知識はありません。しかし、Google Appスクリプトは、このフォーラムのおかげで多大な挑戦をしませんでした。動的に更新する範囲をコピーしてアーカイブシートに貼り付けるための適切なGoogleスクリプトは何ですか?

私はデータアナリストであり、ウェブサイトの出版社にとって基本的なビッグデータの利点のいくつかをエミュレートする低コスト/オープンソースの方法について研究しています。私のクエストはGoogleのスクリプトに私をもたらしました。私は1週間前にそれについて知ったので、私はいくつかを書くことができました。

目的の課題は次のとおりです。

  1. 私は動的にIMPORTHTML機能を使用して、約1000行を引っ張るスプレッドシートを持っています。この範囲は、ソースが毎日リフレッシュされると自動的にリフレッシュされるため、前日のデータは失われます。アーカイブシートのデータをバックアップする必要があるため、選択した時間範囲の履歴データを分析できます。

  2. 行を自動的にコピーして、アーカイブヘッダーのすぐ上に貼り付けて、アーカイブをデータ分析に必要な日付順に並べ替える必要はありません。私はまた重複行をチェックし、それらを削除する必要があります。

最初に、アーカイブされた範囲の最後の行の下にコピーされた行を追加するスクリプトを作成しました。しかし、高度な分析のために、特定の日付範囲、たとえば14日または7日でデータをフィルタリングしなければならなかったため、日付によるソートが必要になりました。そこでソート用のスニペットと重複を削除するスニペットを追加しました。それはうまくいきますが、ソートには長い時間がかかります。また、毎日何千もの新しい行が追加されていることを考慮すれば、それはもっと長くかかるでしょう。私はスマートな解決策が必要でした。

(1)ソース範囲内の行数を検出する(2)アーカイブシートのヘッダーの下に行を挿入し、(3)コピーした範囲を新しく挿入した行に貼り付けるスクリプトを作成し始めました。 。

私はそれを書き終えました。明らかにソーティングは必要ありません。しかし、それをもっと早く、賢く、未来に向ける方法があれば、私は不思議に思っていました。以下のコードを見つけてください。どんな提案も高く評価されます。あなたがGoogleの内達成することができます

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); 
 
    
 
    */ 
 

 
}

+1

あなたはわずか数千行を持っていることを計画しない限り、あなたが真剣に代わりBigQueryのグーグル検討すべきです。アプリスクリプトからそれを使用するためのサンプルがあります。 –

+0

こんにちはジーグマンデル、あなたのコメントのおかげで。あなたbigqueryを使用するためのリンク/リソースを共有してくださいできますか? – AliveToLearn

+0

あなたはこれまでに何をgoogledしましたか? –

答えて

0

ものは、そのようなスプレッドシートへの要求、ドキュメント、サイトと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スクリプト組み込みキャッシュサービスを使用する
  • 使用しないでくださいUIApp; HTMLService

を使用ここで文書リストは、あなたのスクリプトのパフォーマンスを向上させるのに役立ちますベストプラクティスです:https://developers.google.com/apps-script/best_practices#minimize-calls-to-other-services

+0

あなたの答えにd.datul1990を感謝します。 – AliveToLearn

関連する問題