株式会社エアステイ 月次ベース価格自動見直しシステム
Step 1

ベース価格推移マスタ

「価格調整の推移記録」スプレッドシートに自動接続します。ファイルをアップロードして使うこともできます。

「読み込む」を押してください。非公開スプレッドシートの場合は、先に設定欄の「Googleでサインイン」を行ってから読み込んでください。

-
Step 2

新規予約実績データ

PMSから「前月に確定した予約」でエクスポートしたCSV(Booking_*.csv)をアップロードしてください。
「部屋名」列が存在する場合は「物件名+部屋名」をリスティングIDとして自動結合し、部屋単位で集計します。マスタの「物件名」と一致させてください。

📅
クリックまたはドラッグ&ドロップ
ファイル未選択
-
Step 3  任意

現在の予約状況データ

AirHostからダウンロードした予約CSV(全6ファイル、12か月分)をアップロードしてください。
予約が多く入っている物件への誤った値下げを防止します。

🔖
6ファイルをまとめてドラッグ&ドロップ(省略可)
ファイル未選択
-
設定(オプション)
未設定
📋 Google Sheets連携のセットアップ方法(初回のみ・約5分) ▼ 展開

スプレッドシートに小さなスクリプトを1回だけ貼り付けてデプロイします。Google Cloud Consoleの設定は不要です。

1
「価格調整の推移記録」スプレッドシートを開き、上部メニューの 「拡張機能」→「Apps Script」 をクリックします。
2
既存のコードをすべて削除し、以下のスクリプトを貼り付けて 「保存」(Ctrl+S)します。
function doGet(e) { var sheetName = (e && e.parameter && e.parameter.sheet) ? e.parameter.sheet : '各物件単価'; try { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(sheetName); if (!sheet) throw new Error('シートが見つかりません: ' + sheetName); var values = sheet.getDataRange().getValues(); return ContentService.createTextOutput(JSON.stringify({ values: values })) .setMimeType(ContentService.MimeType.JSON); } catch (err) { return ContentService.createTextOutput(JSON.stringify({ error: err.message })) .setMimeType(ContentService.MimeType.JSON); } } function doPost(e) { try { var payload = JSON.parse(e.postData.contents); var ss = SpreadsheetApp.getActiveSpreadsheet(); if (payload.action === 'update_master') { var sheet = ss.getSheetByName(payload.sheetName || '各物件単価'); if (!sheet) throw new Error('マスタシートが見つかりません'); var colIdx = sheet.getLastColumn() + 1; sheet.getRange(1, colIdx).setValue(payload.dateHeader); payload.results.forEach(function(r) { // 既存行から一致する物件名・日区分を探す }); var values = sheet.getDataRange().getValues(); var lastProp = ''; var existingKeys = {}; for (var i = 1; i < values.length; i++) { var propCell = values[i][1]; var dayType = values[i][2]; if (propCell && String(propCell).trim() !== '') lastProp = String(propCell).trim(); if (dayType !== '平日' && dayType !== '週末') continue; var key = lastProp + '|' + dayType; existingKeys[key] = i + 1; // 1-based row } var resultsMap = {}; payload.results.forEach(function(r) { resultsMap[r.propName + '|' + r.dayType] = r.newPrice; }); for (var key in resultsMap) { if (existingKeys[key]) sheet.getRange(existingKeys[key], colIdx).setValue(resultsMap[key]); } // 新規物件を末尾追加 var nextRow = values.length + 1; payload.results.forEach(function(r) { var k = r.propName + '|' + r.dayType; if (!existingKeys[k]) { if (r.dayType === '平日') sheet.getRange(nextRow, 2).setValue(r.propName); sheet.getRange(nextRow, 3).setValue(r.dayType); sheet.getRange(nextRow, colIdx).setValue(r.newPrice); existingKeys[k] = nextRow; nextRow++; } }); } if (payload.action === 'write_report') { var name = '提案レポート_' + payload.runMonth; var ws = ss.getSheetByName(name); if (ws) ws.clearContents(); else ws = ss.insertSheet(name); var rows = [payload.headers].concat(payload.data); if (rows.length > 0) ws.getRange(1, 1, rows.length, rows[0].length).setValues(rows); } return ContentService.createTextOutput(JSON.stringify({ success: true })) .setMimeType(ContentService.MimeType.JSON); } catch (err) { return ContentService.createTextOutput(JSON.stringify({ error: err.message })) .setMimeType(ContentService.MimeType.JSON); } }
3
右上の 「デプロイ」→「新しいデプロイ」 をクリックします。
4
「種類の選択」で 「ウェブアプリ」 を選び、「アクセスできるユーザー」を 「全員」 に設定して 「デプロイ」 をクリックします。
※ Googleアカウントでの承認が求められたら「アクセスを許可」します。
5
表示された 「ウェブアプリのURL」https://script.google.com/macros/s/.../exec)をコピーして、上の設定欄の「GAS Web App URL」に貼り付けます。その後 Step 1 の「読み込む」ボタンを押してください。
-
対象物件数(行数)
-
値上げ
-
価格維持
-
値下げ

価格提案レポート

# 物件名 日区分 旧価格 加重スコア 変動額 新価格 ステータス 備考