Implementing Google Sheets Integration for Device Management in tvview
TL;DR: I integrated Google Sheets with the tvview app, enabling edits to be written back to a sheet for MAC, Model, and Lineup. This involved setting up Google API credentials, modifying the device service, and adding a SheetsWriter provider.
The Problem
The initial problem was to enhance the device management capabilities in the tvview application by integrating Google Sheets. This would allow for seamless editing and synchronization of device information, specifically MAC, Model, and Lineup, directly to a Google Sheet.
What I Tried First
Initially, I focused on setting up the Google API credentials and installing the necessary googleapis package. I added the googleapis package to the project by running:
npm install googleapis
or
"googleapis": "^173.0.0"
in package.json.
The Implementation
Environment Variables and Dependencies
First, I updated .env.example to include Google API credentials:
# --- Google Sheets ---
GOOGLE_SERVICE_ACCOUNT_EMAIL="your-service-account-email@your-project-id.iam.gserviceaccount.com"
GOOGLE_PRIVATE_KEY="your-private-key"
GOOGLE_SPREADSHEET_ID="your-spreadsheet-id"
I also updated package-lock.json and package.json to include the googleapis dependency:
"googleapis": "^173.0.0",
Google Sheets Writer Provider
Next, I created a SheetsWriter.ts provider to handle writing to Google Sheets:
// src/providers/googleSheets/SheetsWriter.ts
import { google } from "googleapis";
export interface SheetWriteResult {
ok: boolean;
message?: string;
}
function getAuth() {
const email = process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL;
const privateKey = process.env.GOOGLE_PRIVATE_KEY;
const spreadsheetId = process.env.GOOGLE_SPREADSHEET_ID;
// Auth logic here
}
export async function writeDeviceFieldsToSheet(deviceId: string, fields: any) {
// Write logic here
}
Device Service Updates
I then updated device.service.ts to integrate with the new SheetsWriter:
// src/services/device.service.ts
import { prisma } from "@/lib/prisma";
import { isValidMac } from "@/lib/mac";
import { writeDeviceFieldsToSheet } from "@/providers/googleSheets/SheetsWriter";
export async function updateDevice(deviceId: string, fields: any) {
// Update logic here
await writeDeviceFieldsToSheet(deviceId, fields);
}
API Route Updates
The API route for device updates was also modified:
// src/app/api/devices/[id]/route.ts
import { NextResponse } from "next/server";
import { updateDevice } from "@/services/device.service";
export async function PATCH(req: Request, { params }: { params: { id: string } }) {
const { id } = params;
const { body } = await req.json();
// Update logic here
await updateDevice(id, body);
return NextResponse.json({ message: "Device updated successfully" });
}
Key Takeaway
The key takeaway from this implementation is the importance of properly handling authentication and authorization when integrating with external services like Google Sheets. Ensuring that sensitive credentials are stored securely and used correctly is crucial.
What's Next
Next, I plan to enhance the error handling and logging for the Google Sheets integration. This will involve implementing retries for failed writes and adding more detailed logging to diagnose issues.
vibecoding #buildinpublic #GoogleSheets #DeviceManagement
Part of my Build in Public series — sharing the real process of building SaaS projects from Playa del Carmen, México.
Repo: zaerohell/tvview · 2026-07-09
#playadev #buildinpublic
Top comments (0)