[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++){
// 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();
}
}
Reference
이 문제에 관하여([Google Apps Script 및 스프레드시트에서 인벤토리 관리] 선택 범위에서 얻은 값을 사용하여 다른 시트로 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kokogento/items/a2aa79525b0b150c816f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)