予実.app

運営マニュアル

運営者向けの運用ガイドです。初期設定から日次運用まで、必要な手順を順番にまとめています。

最短4ステップ:1) GAS接続 → 2) マスタ設定 → 3) 目標/販管費 → 4) 案件入力
運用は必ずGoogle Workspaceで行ってください。
閲覧権限・編集権限をユーザー単位で厳密に管理でき、誤共有や情報漏えいのリスクを大きく下げられるためです。
補足:本アプリは全般的にAI機能を組み込んでいません。案件入力・集計・可視化をシンプルに運用する前提です。

最近のアップデート

  • ● 主要KPI表示と比較表の文言を整理し、初見ユーザーの理解しやすさを改善しました。 2026/03/30
    Xでポスト
  • ● 初期セットアップ手順(GAS接続→保存→固定化)を見直し、運用開始までの手順をさらに分かりやすくしました。 2026/03/29
    Xでポスト
  • ● 導入手順(GAS接続→保存→固定化)を再確認し、運用開始までの迷いを減らす構成へ更新しました。 2026/03/29
    Xでポスト

1. 事前準備(3点)

2. GAS接続(最重要)

ここがつながれば運用準備の8割完了です。
  1. スプレッドシートを作成
  2. GASの Code.gs に下記コードを貼り付け
  3. Webアプリとしてデプロイ(アクセス権:全員)
  4. 発行URLをアプリ設定の GAS URL に貼り付け、GAS URLを保存
  5. このHTMLに固定 を押す
  6. 接続テスト 実行後、右上 で同期確認
右上が「● 同期済み」になれば接続完了です。

GAS (.gs) コピペ用

const DEALS_SHEET_NAME = 'Deals';
const CONFIG_SHEET_NAME = 'Config';
const DEAL_HEADERS = ['id', 'year', 'month', 'cat', 'st', 'tanto', 'name', 'uri', 'gen', 'note'];

function initSheets() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  if (!ss.getSheetByName(DEALS_SHEET_NAME)) {
    const s = ss.insertSheet(DEALS_SHEET_NAME);
    s.appendRow(DEAL_HEADERS);
  }
  if (!ss.getSheetByName(CONFIG_SHEET_NAME)) {
    const s = ss.insertSheet(CONFIG_SHEET_NAME);
    s.appendRow(['key', 'value']);
  }
}

function doGet(e) {
  initSheets();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dealSheet = ss.getSheetByName(DEALS_SHEET_NAME);
  const dealsData = dealSheet.getDataRange().getValues();
  const headers = dealsData[0];
  const deals = [];
  for (let i = 1; i < dealsData.length; i++) {
    let obj = {};
    for (let j = 0; j < headers.length; j++) obj[headers[j]] = dealsData[i][j];
    deals.push(obj);
  }

  const configSheet = ss.getSheetByName(CONFIG_SHEET_NAME);
  const configData = configSheet.getDataRange().getValues();
  let config = {};
  for (let i = 1; i < configData.length; i++) {
    try { config[configData[i][0]] = JSON.parse(configData[i][1]); } catch(err) {}
  }

  return ContentService.createTextOutput(JSON.stringify({ ok: true, deals: deals, config: config }))
    .setMimeType(ContentService.MimeType.JSON);
}

function doPost(e) {
  initSheets();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let data;
  try {
    data = JSON.parse(e.postData.contents);
  } catch(err) {
    return ContentService.createTextOutput(JSON.stringify({ok: false, error: 'Invalid JSON'}))
      .setMimeType(ContentService.MimeType.JSON);
  }

  if (data.action === 'update_config') {
    const sheet = ss.getSheetByName(CONFIG_SHEET_NAME);
    const rows = sheet.getDataRange().getValues();
    let found = false;
    for (let i = 1; i < rows.length; i++) {
      if (rows[i][0] === data.key) {
        sheet.getRange(i + 1, 2).setValue(JSON.stringify(data.value));
        found = true;
        break;
      }
    }
    if (!found) sheet.appendRow([data.key, JSON.stringify(data.value)]);
    return ContentService.createTextOutput(JSON.stringify({ok: true}))
      .setMimeType(ContentService.MimeType.JSON);
  }

  const dealSheet = ss.getSheetByName(DEALS_SHEET_NAME);
  if (data.action === 'create') {
    let d = data.deal;
    dealSheet.appendRow([d.id, d.year, d.month, d.cat, d.st, d.tanto, d.name, d.uri, d.gen, d.note]);
  } else if (data.action === 'update') {
    let d = data.deal;
    let rows = dealSheet.getDataRange().getValues();
    for(let i = 1; i < rows.length; i++) {
      if(rows[i][0] == d.id) {
        dealSheet.getRange(i + 1, 1, 1, DEAL_HEADERS.length)
          .setValues([[d.id, d.year, d.month, d.cat, d.st, d.tanto, d.name, d.uri, d.gen, d.note]]);
        break;
      }
    }
  } else if (data.action === 'delete') {
    let id = data.id;
    let rows = dealSheet.getDataRange().getValues();
    for(let i = 1; i < rows.length; i++) {
      if(rows[i][0] == id) {
        dealSheet.deleteRow(i + 1);
        break;
      }
    }
  }

  return ContentService.createTextOutput(JSON.stringify({ok: true}))
    .setMimeType(ContentService.MimeType.JSON);
}

3. マスタ設定

最初に整えると、後の入力ミスを大きく減らせます。
カテゴリ/ステータス名を変更すると既存案件の移行が必要な場合があります。

4. 目標と販管費

まずはざっくりでOK。運用しながら精度を上げます。
営業利益は「粗利 - 販管費」で計算されます。

5. 案件入力(日次運用)

  1. + 案件追加 をクリック
  2. 案件名・カテゴリ・担当・ステータス・計上月を入力
  3. 売上・原価・備考を入力して保存
保存後、ダッシュボードへ即時反映されます。

6. 課題入力

7. よくあるエラー

困ったら「URL」「権限」「同期」の3点を先に確認してください。
症状原因対応
ローカルモードのままGAS URL未設定 / 権限不足URLとデプロイ権限を確認
同期エラーGAS停止 / CORS / タイムアウトGAS再デプロイ・URL再確認
Access denied許可条件(メール/APIキー)不一致Code.gsとHTML設定を合わせる
数字不一致計上月/ステータス混在フィルタ条件を確認

8. 運用ルール(推奨)

運用前チェック - 右上が「● 同期済み」 - 会社名 / カテゴリ / 担当が正しい - 案件入力がダッシュボードに反映される - 目標・販管費が入力済み