Pelajari cara menggunakan layanan scraping kami untuk mendapatkan data bisnis dari Maps
3 langkah mudah untuk mulai scraping
Buat Spreadsheet baru dan deploy Apps Script untuk menerima data
Isi form order dengan email, keywords, dan URL Apps Script
Setelah pembayaran, scraping akan diproses dan data masuk ke sheet Anda
Ikuti langkah-langkah berikut untuk setup Spreadsheet sebagai penerima data
Buka Drive → Klik "New" → Spreadsheet → Blank spreadsheet
Di Spreadsheet, klik menu Extensions → Apps Script
Copy kode di bawah ini dan paste ke editor Apps Script
/**
* Google Apps Script for Google Maps Scraper Integration
* Version: 1.0.0
* Last Updated: 2025-01-23
*/
function doPost(e) {
try {
Logger.log('Received POST request');
const data = JSON.parse(e.postData.contents);
if (!data.orderId || !data.keyword || !data.results) {
throw new Error('Missing required fields: orderId, keyword, or results');
}
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheetName = `Order_${data.orderId.substring(0, 8)}`;
let sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
sheet = spreadsheet.insertSheet(sheetName);
const headers = [
'No', 'Nama Bisnis', 'Rating', 'Total Review', 'Kategori',
'Alamat', 'Telepon', 'Website', 'Jam Buka', 'Latitude',
'Longitude', 'Google Maps URL', 'Place ID', 'Keyword', 'Timestamp'
];
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
sheet.getRange(1, 1, 1, headers.length)
.setBackground('#667eea')
.setFontColor('#ffffff')
.setFontWeight('bold')
.setHorizontalAlignment('center');
sheet.setFrozenRows(1);
}
const rows = [];
const startRow = sheet.getLastRow() + 1;
const timestamp = new Date().toLocaleString('id-ID');
data.results.forEach((result, index) => {
rows.push([
startRow + index - 1,
result.name || '',
result.rating || '',
result.reviewCount || '',
result.category || '',
result.address || '',
result.phone || '',
result.website || '',
result.hours || '',
result.lat || '',
result.lng || '',
result.url || '',
result.placeId || '',
data.keyword || '',
timestamp
]);
});
if (rows.length > 0) {
const range = sheet.getRange(startRow, 1, rows.length, rows[0].length);
range.setValues(rows);
range.setVerticalAlignment('middle');
for (let i = 0; i < rows.length; i++) {
if (i % 2 === 0) {
sheet.getRange(startRow + i, 1, 1, rows[0].length).setBackground('#f7fafc');
}
}
for (let i = 1; i <= rows[0].length; i++) {
sheet.autoResizeColumn(i);
}
}
createOrUpdateSummary(spreadsheet, data);
return ContentService.createTextOutput(
JSON.stringify({
success: true,
message: 'Data successfully saved',
rowsAdded: rows.length
})
).setMimeType(ContentService.MimeType.JSON);
} catch (error) {
Logger.log('Error: ' + error.message);
return ContentService.createTextOutput(
JSON.stringify({
success: false,
error: error.message
})
).setMimeType(ContentService.MimeType.JSON);
}
}
function createOrUpdateSummary(spreadsheet, data) {
let summarySheet = spreadsheet.getSheetByName('Summary');
if (!summarySheet) {
summarySheet = spreadsheet.insertSheet('Summary', 0);
const headers = ['Order ID', 'Keyword', 'Total Results', 'Last Updated'];
summarySheet.getRange(1, 1, 1, headers.length).setValues([headers]);
summarySheet.getRange(1, 1, 1, headers.length)
.setBackground('#4c51bf')
.setFontColor('#ffffff')
.setFontWeight('bold')
.setHorizontalAlignment('center');
summarySheet.setFrozenRows(1);
}
const lastRow = summarySheet.getLastRow();
const existingData = lastRow > 1 ? summarySheet.getRange(2, 1, lastRow - 1, 4).getValues() : [];
let found = false;
for (let i = 0; i < existingData.length; i++) {
if (existingData[i][0] === data.orderId && existingData[i][1] === data.keyword) {
existingData[i][2] = (parseInt(existingData[i][2]) || 0) + data.results.length;
existingData[i][3] = new Date().toLocaleString('id-ID');
summarySheet.getRange(i + 2, 1, 1, 4).setValues([existingData[i]]);
found = true;
break;
}
}
if (!found) {
const newRow = [
data.orderId,
data.keyword,
data.results.length,
new Date().toLocaleString('id-ID')
];
summarySheet.appendRow(newRow);
}
for (let i = 1; i <= 4; i++) {
summarySheet.autoResizeColumn(i);
}
}
function doGet(e) {
return ContentService.createTextOutput(
JSON.stringify({
status: 'active',
message: 'GMaps Scraper webhook is ready',
version: '1.0.0'
})
).setMimeType(ContentService.MimeType.JSON);
}Klik ikon disk atau tekan Ctrl+S untuk save
Klik "Deploy" → "New deployment"
Setelah deploy, akan muncul URL web app
Saat pertama kali deploy, Google akan minta izin
Tergantung antrian dan jumlah data. Biasanya 5-30 menit. Anda akan menerima email notifikasi saat selesai.
TIDAK. Anda mendapatkan UNLIMITED hasil per keyword. Sistem akan scraping semua data yang tersedia di Google Maps untuk keyword tersebut.
Nama bisnis, alamat lengkap, nomor telepon, website, rating, jumlah review, kategori, koordinat (lat/lng), dan informasi lainnya yang tersedia.
TIDAK. Data langsung dikirim ke Spreadsheet Anda dan tidak disimpan di server kami. Privacy Anda terjamin.
Anda akan mendapat full refund jika scraping gagal karena error sistem kami. Jika gagal karena kesalahan input (URL salah, dll), tidak ada refund.
Maksimal 20 keywords per order. Jika butuh lebih, buat order baru.
Format bebas, tapi sebaiknya spesifik. Contoh: "Barbershop di Jakarta Selatan", "Restaurant seafood di Surabaya", "Hotel murah di Bali".
Ya, bisa. Google Maps worldwide. Contoh keyword: "Coffee shop in Tokyo", "Restaurant in Singapore".
Semua notifikasi dikirim via email: saat order dibuat, pembayaran berhasil, scraping dimulai, dan scraping selesai.
URL Apps Script hanya untuk menerima data ke spreadsheet Anda. Namun sebaiknya jangan share ke orang lain untuk keamanan data Anda.
Rp 25.000 per keyword
Metode Pembayaran: Virtual Account, E-Wallet (GoPay, OVO, Dana, ShopeePay), QRIS, Credit Card
Jika ada pertanyaan atau kendala, hubungi kami
Kami akan respon dalam 24 jam
Dapatkan data bisnis dari Maps sekarang
Buat Order Sekarang