Use Cases (Diperbarui: 2/6/2026)

Automasi Spreadsheet dengan Claude Code: CSV, Google Sheets API, dan Apps Script

Otomatisasi CSV, Google Sheets API, dan Apps Script dengan Claude Code memakai script yang bisa diverifikasi.

Automasi Spreadsheet dengan Claude Code: CSV, Google Sheets API, dan Apps Script

Automasi spreadsheet terlihat kecil, tetapi sering menjadi jalur untuk sales, inquiry, biaya iklan, invoice, dan KPI konten. Jika aturan import salah, tim bukan hanya kehilangan satu baris; tim bisa membaca revenue, prioritas lead, atau biaya campaign yang salah.

Claude Code berguna karena bekerja di repository. Ia bisa membuat script ringkasan CSV, script append Google Sheets API, otomatisasi Apps Script, lalu mengembalikan daftar file berubah, command yang dijalankan, dan risiko tersisa. Catatan verifikasi inilah yang membuat automasi layak dipakai, bukan hanya terlihat cepat.

Artikel ini memakai alur bertahap: ringkasan CSV lokal, append lead ke Google Sheets, lalu klasifikasi inquiry dengan Apps Script. Untuk kebiasaan dasarnya, baca juga tips produktivitas Claude Code dan workflow verification receipt. Referensi resmi: Claude Code docs, Claude Code CLI usage, Google Sheets API Node.js quickstart, Apps Script Sheets guide, dan SheetJS docs.

Tentukan Batas Data Dulu

Keputusan pertama bukan library. Tentukan tabel mana yang menjadi source of truth. Jika angka yang sama bisa diedit di CSV, Google Sheets, CRM, dan sistem accounting, automasi hanya mempercepat kekacauan. Pisahkan input mentah, data yang sudah dibersihkan, dan laporan untuk manusia.

LayerPeranContohTugas untuk Claude Code
RawInput yang tidak diedit manualform submission, CSV pembayaran, export iklanimport, validasi, baris error
CleanData bertipe dan ternormalisasitanggal, amount, statusnormalisasi, dedupe, required columns
ReportOutput untuk manusiarevenue bulanan, prioritas lead, KPIsummary, CSV grafik, notifikasi

Kesalahan umum adalah menulis langsung ke tab Report. Tab itu biasanya punya warna, formula, catatan, frozen row, dan layout untuk dibaca manusia. Mesin butuh header stabil dan baris append-only. Tulis ke Raw atau Clean, lalu biarkan formula, pivot table, Looker Studio, atau script lain membuat Report.

Contoh 1: Ringkas Sales CSV per Bulan

Mulai dari proses tanpa kredensial Google. Dengan begitu Claude Code menghasilkan dasar yang bisa diverifikasi lokal.

Buat data/sales.csv.

date,channel,product,amount,status
2026-05-01,organic,Claude Code Cheatsheet,0,won
2026-05-02,gumroad,Prompt Template Pack,2980,won
2026-05-08,consultation,Team Workshop,120000,won
2026-05-11,gumroad,Prompt Template Pack,2980,refunded
2026-06-01,organic,Claude Code Cheatsheet,0,won
2026-06-02,consultation,Implementation Review,80000,won

Simpan scripts/summarize-sales.mjs.

import { mkdir, readFile, writeFile } from "node:fs/promises";
import path from "node:path";

const inputPath = process.argv[2] ?? "data/sales.csv";
const outputPath = process.argv[3] ?? "out/monthly-summary.csv";

function parseCsvLine(line) {
  const cells = [];
  let current = "";
  let inQuotes = false;

  for (let index = 0; index < line.length; index += 1) {
    const char = line[index];
    const next = line[index + 1];

    if (char === '"' && inQuotes && next === '"') {
      current += '"';
      index += 1;
      continue;
    }

    if (char === '"') {
      inQuotes = !inQuotes;
      continue;
    }

    if (char === "," && !inQuotes) {
      cells.push(current.trim());
      current = "";
      continue;
    }

    current += char;
  }

  cells.push(current.trim());
  return cells;
}

function parseCsv(source) {
  const lines = source.trim().split(/\r?\n/).filter(Boolean);
  const headers = parseCsvLine(lines[0]);

  return lines.slice(1).map((line) => {
    const cells = parseCsvLine(line);
    return Object.fromEntries(headers.map((header, index) => [header, cells[index] ?? ""]));
  });
}

function toMonth(dateValue) {
  const date = new Date(`${dateValue}T00:00:00Z`);
  if (Number.isNaN(date.getTime())) {
    throw new Error(`Invalid date: ${dateValue}`);
  }
  return dateValue.slice(0, 7);
}

const rows = parseCsv(await readFile(inputPath, "utf8"));
const summary = new Map();

for (const row of rows) {
  if (row.status !== "won") continue;

  const amount = Number(row.amount);
  if (!Number.isFinite(amount)) {
    throw new Error(`Invalid amount: ${JSON.stringify(row)}`);
  }

  const key = `${toMonth(row.date)},${row.channel}`;
  const current = summary.get(key) ?? { month: toMonth(row.date), channel: row.channel, deals: 0, revenue: 0 };
  current.deals += 1;
  current.revenue += amount;
  summary.set(key, current);
}

const output = [
  "month,channel,deals,revenue",
  ...[...summary.values()]
    .sort((a, b) => `${a.month}:${a.channel}`.localeCompare(`${b.month}:${b.channel}`))
    .map((row) => `${row.month},${row.channel},${row.deals},${row.revenue}`),
].join("\n");

await mkdir(path.dirname(outputPath), { recursive: true });
await writeFile(outputPath, `${output}\n`, "utf8");

console.log(`Wrote ${outputPath} (${summary.size} groups)`);

Jalankan.

mkdir -p data out scripts
node scripts/summarize-sales.mjs data/sales.csv out/monthly-summary.csv
cat out/monthly-summary.csv

Hal pentingnya adalah gagal secara jelas saat data rusak. Amount kosong, tanggal invalid, atau status baru tidak boleh diam-diam menjadi nol. Setelah itu minta Claude Code menambahkan nomor baris, file rejected rows, dan test untuk refund.

Contoh 2: Append Lead dengan Google Sheets API

Untuk tim, service account biasanya lebih mudah diaudit daripada OAuth personal. Aktifkan Sheets API di Google Cloud, buat JSON key, share spreadsheet ke email service account, dan buat tab Raw dengan createdAt,source,subject,amount,status.

npm install googleapis
export GOOGLE_APPLICATION_CREDENTIALS="$PWD/service-account.json"
export SHEET_ID="your-google-sheet-id"

Buat scripts/append-lead-to-sheet.mjs.

import { google } from "googleapis";

const { GOOGLE_APPLICATION_CREDENTIALS, SHEET_ID } = process.env;

if (!GOOGLE_APPLICATION_CREDENTIALS) {
  throw new Error("GOOGLE_APPLICATION_CREDENTIALS is required");
}

if (!SHEET_ID) {
  throw new Error("SHEET_ID is required");
}

const auth = new google.auth.GoogleAuth({
  keyFile: GOOGLE_APPLICATION_CREDENTIALS,
  scopes: ["https://www.googleapis.com/auth/spreadsheets"],
});

const sheets = google.sheets({ version: "v4", auth });

const source = process.argv[2] ?? "web";
const subject = process.argv[3] ?? "Claude Code consultation";
const amount = Number(process.argv[4] ?? 0);

if (!Number.isFinite(amount)) {
  throw new Error(`Invalid amount: ${process.argv[4]}`);
}

await sheets.spreadsheets.values.append({
  spreadsheetId: SHEET_ID,
  range: "Raw!A:E",
  valueInputOption: "USER_ENTERED",
  insertDataOption: "INSERT_ROWS",
  requestBody: {
    values: [[new Date().toISOString(), source, subject, amount, "new"]],
  },
});

console.log("Appended lead row");

Contoh menjalankan:

node scripts/append-lead-to-sheet.mjs newsletter "Spreadsheet automation review" 50000

Saat Claude Code mengubah script ini, minta ia menjaga nama environment variable, range, urutan kolom, dan aturan tidak menyimpan credential. service-account.json tidak boleh masuk Git, issue, dokumen, atau prompt.

Contoh 3: Klasifikasi Sales dan Inquiry dengan Apps Script

Apps Script cocok jika workflow berada di Google Workspace. Ia bisa merespons form submit, menulis ke Sheets, dan mengirim email tanpa server sendiri. Namun ada quota, trigger, authorization, dan batas email. Untuk volume tinggi, cek Apps Script quotas.

Paste ke Apps Script editor dan buat installable form-submit trigger untuk onFormSubmit.

const SETTINGS = {
  sheetName: "Leads",
  notifyTo: "sales@example.com",
  minAmountForHighPriority: 100000,
};

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu("Lead Ops")
    .addItem("Rebuild lead status", "rebuildLeadStatus")
    .addToUi();
}

function onFormSubmit(event) {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName(SETTINGS.sheetName) || spreadsheet.insertSheet(SETTINGS.sheetName);
  ensureHeader_(sheet);

  const values = event && event.namedValues ? event.namedValues : {};
  const company = first_(values, "Company");
  const email = first_(values, "Email");
  const plan = first_(values, "Plan");
  const budget = Number(first_(values, "Budget") || 0);
  const priority = classifyLead_(plan, budget);

  sheet.appendRow([new Date(), company, email, plan, budget, priority, "new"]);

  if (priority === "high") {
    MailApp.sendEmail({
      to: SETTINGS.notifyTo,
      subject: `High priority lead: ${company}`,
      body: `Company: ${company}\nEmail: ${email}\nPlan: ${plan}\nBudget: ${budget}`,
    });
  }
}

function rebuildLeadStatus() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SETTINGS.sheetName);
  if (!sheet) throw new Error(`Sheet not found: ${SETTINGS.sheetName}`);
  ensureHeader_(sheet);

  const values = sheet.getDataRange().getValues();
  for (let rowIndex = 1; rowIndex < values.length; rowIndex += 1) {
    const row = values[rowIndex];
    const plan = String(row[3] || "");
    const budget = Number(row[4] || 0);
    const priority = classifyLead_(plan, budget);
    sheet.getRange(rowIndex + 1, 6).setValue(priority);
  }
}

function ensureHeader_(sheet) {
  const header = ["createdAt", "company", "email", "plan", "budget", "priority", "status"];
  const current = sheet.getRange(1, 1, 1, header.length).getValues()[0];
  if (current.join("") === "") {
    sheet.getRange(1, 1, 1, header.length).setValues([header]);
    sheet.setFrozenRows(1);
  }
}

function classifyLead_(plan, budget) {
  const normalizedPlan = String(plan).toLowerCase();
  if (budget >= SETTINGS.minAmountForHighPriority || normalizedPlan.includes("team")) {
    return "high";
  }
  if (budget >= 30000) {
    return "medium";
  }
  return "low";
}

function first_(namedValues, key) {
  const value = namedValues[key];
  return Array.isArray(value) ? value[0] || "" : "";
}

Sesuaikan nama field dengan form nyata. Jika field memakai bahasa Indonesia, ganti Company, Plan, dan Budget dengan label asli. Beri Claude Code label persis dan larangan menulis data pribadi ke log.

Template Prompt untuk Claude Code

Prompt yang baik punya scope kecil dan bukti verifikasi.

You are working on spreadsheet automation for this repository.

Goal:
- Import sales CSV rows from data/sales.csv.
- Write a monthly summary to out/monthly-summary.csv.
- Add a Google Sheets append script for the Raw tab.

Scope:
- You may edit scripts/summarize-sales.mjs and scripts/append-lead-to-sheet.mjs.
- You may add small tests or sample CSV files if needed.
- Do not edit content files, product links, analytics, or deployment settings.

Rules:
- Do not commit credentials.
- Use environment variables for SHEET_ID and GOOGLE_APPLICATION_CREDENTIALS.
- Fail loudly on invalid dates, invalid amounts, and missing required columns.
- Keep the code copy-paste runnable with Node.js 20 or later.

Verification:
- Run node --check on every script you edit.
- Run the CSV summary against data/sales.csv.
- For Google Sheets API, verify syntax locally and list the manual credential checks.
- Return changed files, commands run, output summary, and remaining risks.

Command verifikasi:

node --check scripts/summarize-sales.mjs
node scripts/summarize-sales.mjs data/sales.csv out/monthly-summary.csv
node --check scripts/append-lead-to-sheet.mjs
git diff -- scripts/summarize-sales.mjs scripts/append-lead-to-sheet.mjs

Untuk tim, simpan pola ini di CLAUDE.md dan gabungkan dengan panduan permissions Claude Code.

Use Case Praktis

Use case pertama adalah laporan revenue bulanan. Gabungkan export Gumroad, Stripe, invoice manual, dan registrasi PDF gratis. Refund tidak dihitung sebagai revenue, lead gratis tetap dihitung sebagai volume, dan nama produk perlu dinormalisasi.

Use case kedua adalah triage inquiry. Budget, ukuran tim, plan, dan domain customer lama bisa menjadi aturan. Aturan harus bisa dijelaskan. “Budget di atas 100000 yen atau plan team” bisa direview; “kelihatannya bagus” tidak bisa.

Use case ketiga adalah KPI artikel dan iklan. Satu sheet dapat menyimpan slug, publish date, search click, CTA click, product click, dan start form konsultasi. Untuk event name, hubungkan dengan implementasi analytics Claude Code.

Use case keempat adalah pengecekan sebelum invoice. Cocokkan delivery log dengan CSV invoice dan tulis hanya mismatch ke sheet review. Jangan mulai dari auto-send invoice.

Kesalahan yang Perlu Dihindari

Kesalahan pertama adalah header tidak stabil. Jika Amount, amount, dan Revenue bercampur, script bisa sukses tetapi melewatkan baris. Claude Code harus memeriksa required headers.

Kesalahan kedua adalah memperlakukan Sheets sebagai database. Sheets bagus untuk kolaborasi dan review, bukan untuk transaksi, locking, permission utama, atau batch besar. Payment dan access control harus berada di database aplikasi.

Kesalahan ketiga adalah credential leak. Service account JSON tidak boleh masuk prompt, issue, dokumen, atau commit. Instruksikan Claude Code agar tidak membaca, mencetak, atau commit secret.

Kesalahan keempat adalah lupa trigger Apps Script. Paste kode saja belum cukup. Periksa installable trigger, execution user, first authorization, quota email, dan notifikasi error.

Kesalahan kelima adalah hanya melihat total akhir. Report perlu menunjukkan rows read, rows excluded, error count, dan last updated time.

CTA: Jadikan Script Sebagai Operasi

Automasi spreadsheet stabil ketika prompt, permission, dan verifikasi bisa diulang. Mulai dari cheatsheet Claude Code gratis untuk command dan kebiasaan review. Untuk prompt reusable dan template CLAUDE.md, lihat produk ClaudeCodeLab.

Jika tim memakai Sheets untuk sales, leads, ads, atau invoice, tentukan batas credential dan approval manusia sebelum menambah script. Untuk mendesainnya bersama, gunakan training dan konsultasi Claude Code.

Hasil Setelah Dicoba

Dalam workflow Masa, peningkatan terbesar datang sebelum Sheets API: menetapkan CSV headers, aturan exclusion, dan perilaku error. Apps Script berguna untuk klasifikasi lead, tetapi rule notifikasi yang kabur membuat email terlalu banyak. Pendekatan stabil adalah memisahkan Raw, Clean, dan Report, lalu meminta Claude Code mengimplementasikan bagian kecil dengan verifikasi.

#Claude Code #spreadsheet #Excel #Google Sheets #automation
Gratis

PDF gratis: cheatsheet Claude Code

Masukkan email dan unduh satu halaman berisi command, kebiasaan review, dan workflow aman.

Kami menjaga datamu dan tidak mengirim spam.

Masa

Tentang penulis

Masa

Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.