2017-12-19 29 views
0

製造プロセスのステップを経て進行中の作業を追跡するスプレッドシートを作成しています。ループ処理よりも効率的な解決策が必要

このプロセスの各ステップには、各ステージに移動された合計部分の列があります。この列の左側には、ステージに移動されたパーツの数の列があります(パーツは一度にいくつか移動します)。

私のscrpitは "add"カラムの値を "total"カラムに加え、 "add"カラムを ""にリセットします。ここで

コードです:

function addColumns() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    // ss is now the spreadsheet the script is associated with 
    var sheet = ss.getSheets()[0]; // sheets are counted starting from 0 
    // sheet is the first worksheet in the spreadsheet 

    for (var i=4; i<500; i++) { 
     if(sheet.getRange(i,1).getValue()>0){ //Only run if order number not empty 
      //Breakout Column 
      var add = sheet.getRange(i,6); 
      var total = sheet.getRange(i,7); 
      total.setValue(total.getValue() + add.getValue()); 
      add.setValue(""); 
      //CNC Column 
      var add = sheet.getRange(i,8); 
      var total = sheet.getRange(i,9); 
      total.setValue(total.getValue() + add.getValue()); 
      add.setValue(""); 
      //CutSand Column 
      var add = sheet.getRange(i,10); 
      var total = sheet.getRange(i,11); 
      total.setValue(total.getValue() + add.getValue()); 
      add.setValue(""); 
      //Lasered Column 
      var add = sheet.getRange(i,12); 
      var total = sheet.getRange(i,13); 
      total.setValue(total.getValue() + add.getValue()); 
      add.setValue(""); 
      //To Finishing Column 
      var add = sheet.getRange(i,14); 
      var total = sheet.getRange(i,15); 
      total.setValue(total.getValue() + add.getValue()); 
      add.setValue(""); 
      // Defective Column 
      var add = sheet.getRange(i,17); 
      var total = sheet.getRange(i,18); 
      total.setValue(total.getValue() + add.getValue()); 
      add.setValue(""); 
      //Etsy Column 
      var add = sheet.getRange(i,20); 
      var total = sheet.getRange(i,21); 
      total.setValue(total.getValue() + add.getValue()); 
      add.setValue(""); 
     } 
     if(sheet.getRange(i,4).getValue()<1){i=500} //Once you find a blank order exit the loop 
    } 
} 

、これを達成ん書かれたように私のコード;それは私が必要とするものを正確に行います。問題は、コードが各ループのスプレッドシートにアクセスしているため、実行するセルごとにほぼ完全な秒がかかり、注文ごとに7つのステップがあるため、一度に数分で多くの注文を実行できることです。

これはかなり単純な数学的な作業です。そのためには、より効率的な方法が必要です。私は、自分が何をする必要があるかを説明するための適切なキーワードを見つけることができませんでした。

私は何をする必要があるかを学ぶのがとてもうれしく、どんな方向に向かうべきかを知る必要があります。

ありがとうございます!

答えて

0

私はこのような何かをすることをお勧め:(テストしていない)

function addColumns() { 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]; // Refers to the first worksheet in the spreadsheet 
    var data = sheet.getDataRange().getValues(); // Acquires all values of the sheet 
    for (var i = 3; i < data.length; i++) { // Loop over every row 
     if (data[i][0].length > 0) { // Check if first column has a value 

      // Breakout 
      sheet.getRange(i+1,7).setValue(parseFloat(data[i][6]) + parseFloat(data[i][5])); 
      sheet.getRange(i+1,6).clear(); 

      // Repeat code above for other columns 
     } 
    } 
} 

このコードではなく、500行の一定量をループのシートからすべてのデータを取得します。あなたのデータが4行目から始まると仮定して、私は上記のコードでもこれを実装しました。

変数dataは、常にすべての範囲(セル)の値をフェッチするのではなく、すべてのデータを一度に取得します。私はあなたのスクリプトをかなり時間を節約することを期待しています。

データを一度に取得するため、スクリプトはその値を文字列として認識します。合計列の新しい値を計算する前に、値を浮動小数点数(小数点以下の数値)として解析します。

シートは同じフォーマットでは用意されていないため、上記のコードはテストされていませんが、ロジックがはっきりしていて、動作しないと思っています。あなたのシートのために働く。

関連する問題