A

গুগল শিট সিনক্রোনাইজেশন (Google Sheets Sync)

আপনার সব ডাটা এক্সেল/গুগল শিটে ব্যাকআপ এবং রিপোর্ট হিসেবে পাওয়ার মাধ্যম।

1

সেটআপ করার নিয়ম (Setup Instructions)

একটি নতুন **Google Sheet** তৈরি করুন।

শিটের উপরে থাকা **Extensions > Apps Script** মেনুতে ক্লিক করুন।

খুলে যাওয়া পেজে থাকা কোড মুছে দিয়ে ডান পাশের **"Copy Script"** বাটনে ক্লিক করে পাওয়া কোডটি পেস্ট করুন।

সেটআপ শেষ হলে গুগল শিটের উপরে থাকা **🔄 AMA Sync > Enable Auto-Update** অপশনে ক্লিক করুন।

ব্যাস! এখন থেকে প্রতি ১৫ মিনিট পর পর ডাটা অটো আপডেট হতে থাকবে।

আপনার ডাটা লিঙ্ক:

https://ama.doughrear.com//api/sync_google_sheets.php
2

গুগল স্ক্রিপ্ট (Google Code)

/**
 * GOOGLE APPS SCRIPT: AMA Sync (Auto-Update Version)
 * Paste this into Google Sheets > Extensions > Apps Script
 */

var API_URL = "https://ama.doughrear.com/api/sync_google_sheets.php";

/**
 * SETUP FUNCTION: Run this ONCE to enable auto-update every 20 mins
 */
function setupAutoUpdate() {
  // Delete existing triggers to avoid duplicates
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }

  // Create a new trigger: Run syncData every 15 minutes
  ScriptApp.newTrigger('syncData')
      .timeBased()
      .everyMinutes(15)
      .create();

  SpreadsheetApp.getActiveSpreadsheet().toast("স্বয়ংক্রিয় আপডেট চালু হয়েছে! এখন থেকে প্রতি ১৫ মিনিট পর পর ডাটা অটো আপডেট হবে।", "Success 🔄", 10);
}

function doGet() {
  try {
    var result = syncData();
    return ContentService.createTextOutput("Sync Completed Successfully! " + result.message)
      .setMimeType(ContentService.MimeType.TEXT);
  } catch (e) {
    return ContentService.createTextOutput("Sync Failed: " + e.toString())
      .setMimeType(ContentService.MimeType.TEXT);
  }
}

function syncData() {
  var response = UrlFetchApp.fetch(API_URL);
  var json = JSON.parse(response.getContentText());

  if (json.status !== "success") {
    throw new Error(json.message || "API returned error status.");
  }

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var data = json.data;

  var tables = ["customers", "bills", "payments", "loads", "chalan_distributions", "employees"];

  tables.forEach(function(tableName) {
    if (data[tableName] && data[tableName].length > 0) {
      updateTab(ss, tableName, data[tableName]);
    }
  });

  return { message: "Updated " + tables.length + " tabs." };
}

function updateTab(ss, sheetName, rows) {
  var sheet = ss.getSheetByName(sheetName);
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
  }

  sheet.clear();
  sheet.clearFormats();

  var headers = Object.keys(rows[0]);
  sheet.appendRow(headers);

  var dataValues = rows.map(function(row) {
    return headers.map(function(header) {
      return row[header];
    });
  });

  var dataRange = sheet.getRange(2, 1, dataValues.length, headers.length);
  dataRange.setValues(dataValues);

  // Header Styling
  var headerRange = sheet.getRange(1, 1, 1, headers.length);
  headerRange.setFontWeight("bold").setBackground("#1e293b").setFontColor("#ffffff");
  headerRange.setVerticalAlignment("middle").setHorizontalAlignment("center");

  // Zebra Stripes
  dataRange.setBackground("#ffffff");
  for (var i = 1; i <= dataValues.length; i++) {
    if (i % 2 === 0) {
      sheet.getRange(i + 1, 1, 1, headers.length).setBackground("#f8fafc");
    }
  }

  sheet.getRange(1, 1, dataValues.length + 1, headers.length).setBorder(true, true, true, true, true, true, "#e2e8f0", SpreadsheetApp.BorderStyle.SOLID);
  sheet.setFrozenRows(1);
  sheet.autoResizeColumns(1, headers.length);
  sheet.setRowHeights(1, dataValues.length + 1, 30);
}

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('🔄 AMA Sync')
      .addItem('Sync Now (সব তথ্য আপডেট করুন)', 'syncData')
      .addSeparator()
      .addItem('Enable Auto-Update (২০ মিনিট পর পর অটো আপডেট)', 'setupAutoUpdate')
      .addToUi();
}