「拡張機能」→「Apps Script」 にコードを貼り付けて保存。さらに「プロジェクトの設定」→「スクリプト プロパティ」で
API_TOKEN にお店の合言葉を設定
// ソナレア補聴器 在庫管理 GAS v2
// v2: 合言葉(トークン)を必ず確認。スクリプトプロパティ API_TOKEN にお店の合言葉を設定してください。
var ITEM_SHEET = '在庫データ';
var LOG_SHEET = '入出庫履歴';
var ITEM_HEADERS = ['ID','商品名','カテゴリ','店舗','在庫数','発注点','単価','更新日時'];
var LOG_HEADERS = ['日時','商品ID','商品名','店舗','区分','増減','在庫後'];
function sheet_(name, headers){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName(name);
if(!sh){ sh = ss.insertSheet(name); }
if(sh.getLastRow() === 0){ sh.appendRow(headers); }
return sh;
}
function json_(obj){
return ContentService.createTextOutput(JSON.stringify(obj))
.setMimeType(ContentService.MimeType.JSON);
}
function doPost(e){
var data = JSON.parse(e.postData.contents);
var TOKEN = PropertiesService.getScriptProperties().getProperty('API_TOKEN') || '';
if (!TOKEN || data.token !== TOKEN) return json_({ok:false, error:'unauthorized'});
if (data.action === 'ping') return json_({ok:true, pong:true});
var action = data.action;
var items = sheet_(ITEM_SHEET, ITEM_HEADERS);
if(action === 'getAll'){
return json_({ok:true, data: items.getDataRange().getValues()});
}
if(action === 'save'){
var it = data.item;
var row = [it.id, it.name, it.cat, it.store, it.qty, it.min, it.price, new Date()];
var all = items.getDataRange().getValues();
var found = false;
for(var i = 1; i < all.length; i++){
if(all[i][0] === it.id){ items.getRange(i+1,1,1,row.length).setValues([row]); found=true; break; }
}
if(!found) items.appendRow(row);
return json_({ok:true});
}
if(action === 'delete'){
var all2 = items.getDataRange().getValues();
for(var j = 1; j < all2.length; j++){
if(all2[j][0] === data.id){ items.deleteRow(j+1); break; }
}
return json_({ok:true});
}
if(action === 'log'){
var lg = sheet_(LOG_SHEET, LOG_HEADERS);
var h = data.entry;
lg.appendRow([new Date(), h.itemId, h.name, h.store, h.type, h.delta, h.after]);
return json_({ok:true});
}
if(action === 'history'){
var lg2 = sheet_(LOG_SHEET, LOG_HEADERS);
var rows = lg2.getDataRange().getValues();
var body = rows.slice(1);
body = body.slice(Math.max(0, body.length-100)).reverse();
return json_({ok:true, data: body});
}
return json_({ok:false, error:'unknown action'});
}