0

私は JavaScript に比較的慣れていないので、ご容赦ください。

名前付き範囲を介して隣接する2つのセルに座っている人の机の番号と名前をラベル付けするGoogleスプレッドシートに座席表があります。コードですべての名前付き範囲をループして、デスク番号と人の値を取得し、それを 2 つの列 (1 つの列にデスク番号、別の列にユーザー名) の新しいシートに吐き出します。私が抱えている主な問題は、一部のデスク番号/ユーザー範囲が垂直 (例:desk_1 = Sheet1!F6:F7、F6 はデスク番号、F7 はユーザー) であり、一部の範囲は水平 (例:desk_2 = Sheet1! G2:H2 (G2 はユーザー、H2 はデスク番号) であるため、複数の方向から検索する方法がわかりません。これは私のコードの一部ですが、現在は機能していません。どんなアドバイスでも大歓迎です!!

enter code here
function findSeats() {
var sheet = SpreadsheetApp.getActiveSheet();
var wbk = SpreadsheetApp.getActiveSpreadsheet(); 

var rng_convention = "desk_"; 
var desk_name = rng_convention; 

var users = new Array();

for ( var i = 0; i <= 1000; i++) { 
  desk_name = rng_convention; 
  desk_name = desk_name + i; 

  var rng = wbk.getRangeByName(desk_name); 

if( !rng ) { 
  continue; }
else { 
  var vals = rng.getValues(); 
  var k = 0; 

  if(vals.length == 1) {
    //look left right horizontally for user
    if(vals[0][0] == i) { 
      // create a user for this named range. 
      var user = new Object(); 

      user.name = vals[0][1]; 
      user.position = vals[0][0]; 
      users[k] = user; 
      k++;
    }
    else { 
      //look right left horizontally for user
      if (vals [0][1] == i){
      // create the user for this named range. 
      var user = new Object();

      user.name = vals[0][0]; 
      user.position = vals[0][1]; 
      users[k] = user; 
      k++;
      }
    }
  } 
/*      else {
    /* something is wrong, I need to look up-down, and then down up for users */
  }
 } 
return users; 

};
4

1 に答える 1

2

あなたは間違いなく正しい方向に進んでいました。唯一の本当のバグはvar k = 0、ループ内で設定しているが、同じループでそれをインクリメントしようとしていることです。その結果、ユーザーは1人だけになります。

デスクとユーザーのペアリングが水平に配置されているか垂直に配置されているかを判断できるようにする必要があります。lengthこれを行うには、によって返される2次元配列のをチェックします.getValues()。これはうまく機能します。問題ありません。

あなたの質問では、デスクとユーザーのペアの2つの配置について言及していますが、コードでは、コーディングした水平方向でデスク番号の場所を探しているため、4つについて懸念しているように見えます。名前が反対のセルにあると仮定します。デスク番号が常に範囲名と一致している限り、これは機能します。(代わりに、値がであるかどうかを確認することもできますnumber。)

それで、これが私がこの仕事をするために行った変更です。

  • まず、完全に削除し、アレイの構築にk依存しました。これは、はるかに単純でエラーが発生しにくいものです。push()users
  • ユーザーオブジェクトの作成を、向きをテストするif-then-elseブロックの外に移動し、同時にデスク番号を設定しました。(その値はすでにループ値であるため、スプレッドシートから読み取る必要はありません。)
  • クリーンアップされた水平方向の処理を反映して、垂直方向の処理を完了しました。(ご存知のとおり...これをさらに最適化することはできますが、明確さが失われます。)
  • コメントを追加し、インデントを整理しました。(実際、私がコードを検査していたときにそれを行いました。)

結果として機能するコードは次のとおりです。

function findSeats() {
  var wbk = SpreadsheetApp.getActiveSpreadsheet(); 

  var rng_convention = "desk_"; 
  var desk_name = rng_convention; 

  var users = new Array();

  for ( var i = 0; i <= 1000; i++) { 
    desk_name = rng_convention + i; 

    var rng = wbk.getRangeByName(desk_name); 

    if ( !rng ) { 
      // No matching range name
      continue; 
    }
    else { 
      var vals = rng.getValues(); 

      // create a user for this named range. 
      var user = new Object(); 
      user.position = i; 

      var valsLength = vals.length;
      // Check orientation of the range:
      //    Horizontal...  vals.length == 1 (row)
      //    Vertical means vals.length == 2 (rows)
      if(vals.length == 1) {
        // Check whether we have desk / user, or user / desk
        if(vals[0][0] == i) { 
          // desk / user
          user.name = vals[0][1]; 
        }
        else { 
          // user / desk
          user.name = vals[0][0]; 
        }
      }
      else {
        // vals.length == 2
        // Check whether we have desk / user, or user / desk
        if(vals[0][0] == i) { 
          // desk / user
          user.name = vals[1][0]; 
        }
        else { 
          // user / desk
          user.name = vals[0][0]; 
        }
      }

      // Add this user to our array
      users.push(user);
    }
  }
  // Return array of user objects
  return users; 
};

サンプルデータ

サンプルデータ

デバッグ出力

デバッグ出力

編集:収集したすべてのデータをスプレッドシートに記録します

フォローアップの質問に答えるには、収集したすべてのデスクとユーザーの情報をスプレッドシートに入れるのは簡単です。関数の準備をするには.setValues()、オブジェクトを2次元配列に変換する必要があります。これは簡単です。または、前のコードをリファクタリングして、最初に配列を生成することもできます。

変換を実行し、すべてのデータをシートに書き込む方法は次のとおりです。名前付きシートが存在しない場合は、最初に作成します。存在しない場合は、前のコンテンツを置き換えるだけです。

// Record all desk / user data to a (new) sheet
function recordAllDeskUsers() {
  var users = findSeats();
  var userArray = new Array();
  userArray.push(["Desk #","User Name"]);

  for (var i in users) {
    var thisUser = [users[i].position,users[i].name];
    userArray.push(thisUser);
  }

  // Open the target sheet - if it doesn't exist, insert it.
  var userSheetName = "All Desks";
  var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(userSheetName);
  if (!userSheet) {
    SpreadsheetApp.getActiveSpreadsheet().insertSheet(userSheetName)
    userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(userSheetName);
  }

  // Clear the sheet, then write our collected values to it.
  userSheet.clear();
  userSheet.getRange(1, 1, userArray.length, userArray[0].length).setValues(userArray);
}
于 2013-03-20T02:20:53.763 に答える