2017-09-03 11 views
0

私はこれをproblemとしました。Cooperは、それを解決するのに役立ちましたが、今は別のもので苦労しています。次のスクリプトは、クライアントコードが昨日の第2条件として別のスプレッドシートに表示される回数をカウントします。配列からデータを保存して後で使用する

function countSheets() 
{ 
    var vA = appSh(); 
    var td = Utilities.formatDate(subDaysFromDate(new Date(),2), Session.getScriptTimeZone(), "dd/MM/yyyy"); 
    var mbs=getAllSheets(); 
    //var s=''; 
    for (var i=2;i<vA.length;i++) 
    { 
    var d = Utilities.formatDate(new Date(vA[i][12]), Session.getScriptTimeZone(), "dd/MM/yyyy"); 
    for(var key in mbs) 
    { 
     if(vA[i][0]==key && d==td) 
     { 
     mbs[key]+=1; 
     } 
    } 
    } 
    return mbs; 
} 

それからメインスプレッドシート(​​表)の文字列を検索し、発見された場合にも、昨日の日付を検索し、列番号が返され、行番号が返され、次のコードを持っています。これらの情報に基づいて、最初のスクリプトからカウント結果を貼り付ける必要がある範囲を取得します。

function runScript() 
{ 
    var ss=SpreadsheetApp.openById('ID'); 
    var mbs=countSheets(); 
    for(var key in mbs) 
    { 
    var sh=ss.getSheetByName(key); 
    var rg=sh.getDataRange(); 
    var vA=rg.getValues(); 
    for(var i=0;i<vA.length;i++) 
    { 
     if(vA[i][1]=='Total Number of Applications') 
     { 
     var nr=i; 
     break;//by terminating as soon as we find a match we should get improved performance. Which is something you cant do in a map. 
     }    
    } 
    if(typeof(nr)!='undefined')//If we don't find a match this is undefined 
    { 
     var today=subDaysFromDate(new Date(),2).setHours(0,0,0,0); 
     for(var i=0;i<vA[3].length;i++) 
     { 
     if(vA[3][i])//Some cells in this range have no contents 
     { 
      if(today.valueOf()==new Date(vA[3][i]).valueOf()) 
      { 
      sh.getRange(nr+1,i+1,1,1).setValue(Number(mbs[key])); 
      } 
     } 
     } 
    } 
    } 
    return sh; 
} 

問題:私はメインのスプレッドシートに24行を持っています。だから私は同じスクリプトを24回書く必要があります。例として、アプリケーションの総数、コールの総数、ライブ広告の数などをカウントする必要があります。これを行うと、各スクリプトは実行に平均25秒かかりますので、実行時間を超えます。

私は、このウェブサイトとインターネットでいくつかの調査を行い、値の格納とそれらの繰り返しの使用について繰り返しました。現時点では、私のスクリプトは毎回同じファイルを通過し、各条件を数える必要があります。

Q1: 2番目のスクリプトのすべての文字列を含む別の配列を作成する可能性はありますか?

Q2: PropertiesServiceなどを使用してデータを格納する方法。getValues()を何度も実行する必要はありませんか?私はGoogleドキュメントを読んだことがありますが、それはあまり理解できませんでした。

私はそれがすべて意味を持ち、この問題を解決できることを願っています。

よろしく、

ありがとうございました!あなたの問題へ

答えて

0

私のアプローチは

おそらく、行のカップルのためにそれを書く必要がありますし、それらの2を見て、それぞれに固有のものを参照してください。それぞれ独自の点は、外部ファンクションコールを使用してストアする方法やアクセスする方法を理解する必要があることです。

時間の問題では、これらの機能を別々に実行する必要があります。私は正確にそれを行うデータベースを読み込むために使用するダイアログがあります。 800行をロードして10秒間待ってから、別の800行をロードして10秒間待機し、それ以上行がなくなるまで続けます。実際にはこれを行うのに約10分かかりますが、動作している間に何か他のことをすることができるので、どれくらい時間がかかっても本当に気にしません。私はGoogleサーバーへの影響を最小限に抑えることに心配しています。だから、ちょうど楽しみのためにこれを実行しないでください。

ところで、10秒の遅延はgs関数の外部にあります。

+0

スクリプトを遅くする唯一のことは、すべての単一シートに対してアプリケーションシート値を取得する必要があることです。シート1 - > getValues() - >ループ、シート実行 - > getValues() - >ループ...を実行するので、シートのすべての値を再利用するためのソリューションが必要です。 –

+0

現実には、一度にすべてのシートに対してgetValues()を実行することはできません。だから一度にそれらをすべて取得し、それらを配列に格納することは、あなたをそれほどうまくやってくれません。これは6分間ですべてのことをやっていないように聞こえるので、私は別の方法について考えてみようと思います。 [''いつでもあなたが望むものを手に入れることはできません。しかし、試してみると、時にはあなたが必要とするものを手に入れることができるかもしれません。 ''(https://www.youtube.com/watch?v=PkGrkNu6mDg) – Cooper

+0

ありがとう助けと助言!!! –

関連する問題