私はGoogle Appのスクリプティングが初めてです。基本的なHTML以外のあらゆるタイプのスクリプトについての事前知識はありません。しかし、Google Appスクリプトは、このフォーラムのおかげで多大な挑戦をしませんでした。動的に更新する範囲をコピーしてアーカイブシートに貼り付けるための適切なGoogleスクリプトは何ですか?
私はデータアナリストであり、ウェブサイトの出版社にとって基本的なビッグデータの利点のいくつかをエミュレートする低コスト/オープンソースの方法について研究しています。私のクエストはGoogleのスクリプトに私をもたらしました。私は1週間前にそれについて知ったので、私はいくつかを書くことができました。
目的の課題は次のとおりです。
私は動的にIMPORTHTML機能を使用して、約1000行を引っ張るスプレッドシートを持っています。この範囲は、ソースが毎日リフレッシュされると自動的にリフレッシュされるため、前日のデータは失われます。アーカイブシートのデータをバックアップする必要があるため、選択した時間範囲の履歴データを分析できます。
行を自動的にコピーして、アーカイブヘッダーのすぐ上に貼り付けて、アーカイブをデータ分析に必要な日付順に並べ替える必要はありません。私はまた重複行をチェックし、それらを削除する必要があります。
最初に、アーカイブされた範囲の最後の行の下にコピーされた行を追加するスクリプトを作成しました。しかし、高度な分析のために、特定の日付範囲、たとえば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);
*/
}
あなたはわずか数千行を持っていることを計画しない限り、あなたが真剣に代わりBigQueryのグーグル検討すべきです。アプリスクリプトからそれを使用するためのサンプルがあります。 –
こんにちはジーグマンデル、あなたのコメントのおかげで。あなたbigqueryを使用するためのリンク/リソースを共有してくださいできますか? – AliveToLearn
あなたはこれまでに何をgoogledしましたか? –