[Google Apps Script 및 스프레드시트에서 인벤토리 관리] 선택 범위에서 얻은 값을 사용하여 다른 시트로 계산

소개



이 동영상을 보실 수 있으면 대략 무엇을 하는지 이해해 주실 수 있을까. .

Google Apps Script에서 인벤토리 관리] 선택 영역에서 얻은 값을 사용하여 다른 시트로 계산합니다. 피 c. 라고 r. 이 m / wDrpm 또는 9w3


경위



June 19, 2020

여기 계속



스프레드시트로 액세서리의 재고 관리를 하고 있으면, 매우 귀찮은 것이 이하의 작업!
在庫として保有している材料の数 ー 今回使った材料の数 = 現在の在庫の数



액세서리 제작에 사용하는 재료의 수는 많은 것 같고, 그것을 매번 수동으로 스프레드 시트를 사용 빼는 것이 귀찮다고 하는 것이군요. . .



준비하는 것



재고를 정리한 시트



Google Apps Script 입력한 문자를 다른 시트에서 검색하고 그 옆에 있는 문자를 내보내기



만든 아이템을 정리한 시트





전체 흐름



①「제작한 아이템」의 시트로 사용한 재료를 범위 선택(동영상 참조)

② 커스텀 메뉴로 버튼을 만들어 두고, 그것을 누르는 것으로 발동해, ①에서 선택한 범위를 2차원 배열로 취득

③ 「재고」시트에서 같은 이름의 재료를 검색하여, 2개 옆의 셀의 값(각 재료의 재고수)을 취득

④②와 ③에서 취득한 재고수를 뺀 나머지 재고수를 내보내기



대략의 처리의 흐름은 이런 느낌.



모든 코드




코드.gs

// Spreadsheetが開かれた時に自動的に実行されます.
function onOpen() {
  // 現在開いている、スプレッドシートを取得します.
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // メニュー項目を定義します.
  var entries = [
    {name : "在庫から使った数を減らす"  , functionName : "menuItem1"},
  ];
  // 「Custom」という名前でメニューに追加します.
  spreadsheet.addMenu("Custom", entries);
}

 // menuItem1をクリックした時の処理
function menuItem1() {
 //現在アクティブなシートの名前を取得
 var nowSheet = SpreadsheetApp.getActiveSheet().getName();
     //シート「作ったアイテム」以外で実行したらアラート
  if (nowSheet === '作ったアイテム') {
     var data = getData();
     matchData(data);
    } else {
    alert();
    }
}

function getData() {
    //現在のスプレットシートを取得する
    var sheet1 = SpreadsheetApp.getActiveSheet();
    var values = sheet1.getActiveRange().getValues();
    var numRows = sheet1.getActiveRange().getNumRows();

    return [values, numRows];
}

function matchData(data) {
    //現在のスプレッドシートを取得
 var ss = SpreadsheetApp.getActiveSpreadsheet();
   //シート「在庫」を取得
 var stockSheet = ss.getSheetByName('在庫');

  //使った材料の配列「values」をdataの中から取り出す
  var items = data[0];

 // ループする回数「numRows」をdataの中から取り出す
  var dataNumRows = data[1];
  var stopSetCount = dataNumRows - 1;

  for(var i = 0; i <= stopSetCount; i++){
    var item = items[i];

    var itemName = item[0];
    var usedCount = item[2];

    //シート「在庫」で材料名を探す
    var textFinder = stockSheet.createTextFinder(itemName);
    var ranges = textFinder.findAll();
    //材料名のセル範囲を取得
    var textPos = ranges[0].getA1Notation();
    //材料名の位置を取る
    var textPosCell = stockSheet.getRange(textPos);
    //材料名の2つ右隣のセルの値を取る
    var targetValue = textPosCell.offset(0, 2).getValue();
    //在庫の数から使った数を引く
    var afterUsedCount = targetValue - usedCount;
    textPosCell.offset(0, 2).setValue(afterUsedCount);
  }
}

function alert() {
  var ui = SpreadsheetApp.getUi();
  var title = '「作ったアイテム」のシートで実行してよ';
  var text = 'おかしくなるから!';
  ui.alert(title, text, ui.ButtonSet.OK_CANCEL);
}



가볍게 해설



왜 반복하는 횟수를 -1하는가?



// ループする回数「numRows」をdataの中から取り出す
  var dataNumRows = data[1];
  var stopSetCount = dataNumRows - 1;

 for(var i = 0; i <= stopSetCount; i++){


범위 선택한 부분이 몇 줄입니까? 를 취득해, 루프를 돌리는 횟수를 결정하고 있는데, 왜 -1 하는 것인가?

결론을 말하면 -1하지 않으면 루프하는 횟수가 한 번 늘어나기 때문이다.



만약 범위 선택한 부분이 4행이었다고 한다. 그러면 4회 루프하지 않으면 안 된다.

그러나, for분은 var i = 0; 로 0으로부터 시작되고 있다. 따라서 -1을하지 않으면 한 번 반복되는 횟수가 증가하여 오류가 발생합니다.



이므로 var i = 0;var i = 1; 로 해도 좋다.



matchData에서받는 data는 무엇입니까?



 // menuItem1をクリックした時の処理
function menuItem1() {
 //省略
     var data = getData();
     matchData(data);
  //省略
}


function matchData(data) {
//省略
//使った材料の配列「values」をdataの中から取り出す
  var items = data[0];

 // ループする回数「numRows」をdataの中から取り出す
  var dataNumRows = data[1];

}


여기서 받고 있는 것은 getData() 로 돌려주어지고 있는 값.

첫 번째 배열 (즉, values)이 범위 선택한 부분의 데이터는 2 차원 배열로 포함됩니다.

두 번째 배열 (즉, numRows)이 "범위 선택한 부분은 몇 줄 있었습니까?"라는 데이터가 들어 있습니다.



function getData() {
    //現在のスプレットシートを取得する
    var sheet1 = SpreadsheetApp.getActiveSheet();
    //getValueではなくgetValues。複数形のsがあるよ!
    var values = sheet1.getActiveRange().getValues(); 
    var numRows = sheet1.getActiveRange().getNumRows();

    return [values, numRows];
}


사용자 정의 메뉴는 이 부분으로 만들어집니다.



// Spreadsheetが開かれた時に自動的に実行されます.
function onOpen() {
  // 現在開いている、スプレッドシートを取得します.
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // メニュー項目を定義します.
  var entries = [
    {name : "在庫から使った数を減らす"  , functionName : "menuItem1"},
  ];
  // 「Custom」という名前でメニューに追加します.
  spreadsheet.addMenu("Custom", entries);
}

 // menuItem1をクリックした時の処理
function menuItem1() {
 //現在アクティブなシートの名前を取得
 var nowSheet = SpreadsheetApp.getActiveSheet().getName();
     //シート「作ったアイテム」以外で実行したらアラート
  if (nowSheet === '作ったアイテム') {
     var data = getData();
     matchData(data);
    } else {
    alert();
    }
}

좋은 웹페이지 즐겨찾기