1. Overview

In a typical testing workflow, creating presentation slides for test reports (e.g., test summaries, module status, KPI reports) is often time-consuming due to:

  • Manually copying slide templates
  • Entering test data for each slide
  • Adjusting layout and formatting

To solve this problem, I implemented an automated solution:

Generate Google Slides from Google Sheets using Google Apps Script with template and placeholder replacement

This approach allows:

  • Generating 10+ slides automatically
  • Synchronizing real test data from Google Sheets
  • Reducing manual effort and human error

2. Example Data & Template (Real Case)

📊 Google Sheets (Data Source)

The dataset used:

TITLEMODULE_NAMETOTAL_CASESPASSEDFAILEDTESTER_NAMESTATUS_COLOR
Login Security TestAuthentication45423Nguyễn Văn ARed
Dashboard UI CheckUser Interface30300Trần Thị BGreen
Checkout Flow TestE-commerce60555Lê Văn CRed

👉 Each row represents one slide


🖥️ Google Slides Template

Slide 1 (Title slide)

{{TITLE}}{{MODULE_NAME}} | {{TESTER_NAME}}

Slide 2 (Detail slide)

{{MODULE_NAME}}Tổng số case: {{TOTAL_CASES}}  
Số case pass: {{PASSED}}
Số case fail: {{FAILED}}

👉 Placeholders are customized based on real testing data instead of generic ones like {{POINT1}}.


3. Solution Architecture

  • Google Sheets → Data source
  • Google Slides Template → Predefined layout with placeholders
  • Google Apps Script → Automation engine

4. Folder Setup (Reproducible)

Prepare:

Template Presentation ID: YOUR_TEMPLATE_ID  
Output Folder ID: YOUR_FOLDER_ID
👉 These IDs ensure the solution is reusable and scalable.

5. Full Apps Script Code

const CONFIG = {
TEMPLATE_ID: '1PenP76oNotkbbZ58yJMrH-OebQ_8GJeh2XCAIx4ZZcE',
OUTPUT_FOLDER_ID: '1cyXmz30_xRcbjo0ZQQozHWH79XD3WrIu',
SHEET_NAME: 'Data' // Đảm bảo tên Sheet chứa dữ liệu của bạn đang là 'Data'
};

function generateBulkSlides() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(CONFIG.SHEET_NAME);

const dataRange = sheet.getDataRange();
const data = dataRange.getValues();
data.shift();

const outputFolder = DriveApp.getFolderById(CONFIG.OUTPUT_FOLDER_ID);
const templateFile = DriveApp.getFileById(CONFIG.TEMPLATE_ID);

let tempSheet = ss.getSheetByName("TEMP_CHART");
if (!tempSheet) {
tempSheet = ss.insertSheet("TEMP_CHART");
}

data.forEach((row, index) => {
if (!row[0]) return;

const presentationName = `Report_${row[1]}_${new Date().toISOString().split('T')[0]}`;

const newFile = templateFile.makeCopy(presentationName, outputFolder);
const slideDeck = SlidesApp.openById(newFile.getId());

// 👉 Mapping mới theo sheet của bạn
const mapData = {
'{{TITLE}}': row[0] || '',
'{{MODULE_NAME}}': row[1] || '',
'{{TOTAL_CASES}}': row[2] || 0,
'{{PASSED}}': row[3] || 0,
'{{FAILED}}': row[4] || 0,
'{{TESTER_NAME}}': row[5] || '',
'{{STATUS_COLOR}}': row[6] || ''
};

for (const [placeholder, value] of Object.entries(mapData)) {
slideDeck.replaceAllText(placeholder, value.toString());
}

// 👉 Tạo chart mới (Passed vs Failed)
tempSheet.clear();

const chartData = [
["Status", "Count"],
["Passed", row[3] || 0],
["Failed", row[4] || 0],
];

tempSheet.getRange(1, 1, chartData.length, 2).setValues(chartData);

const chartBuilder = tempSheet.newChart()
.setChartType(Charts.ChartType.PIE) // 👈 đổi sang pie cho dễ nhìn
.addRange(tempSheet.getRange("A1:B3"))
.setOption('title', `Test Result - ${row[1]}`)
.setPosition(1, 1, 0, 0)
.build();

tempSheet.insertChart(chartBuilder);

const tempCharts = tempSheet.getCharts();
const currentChart = tempCharts[tempCharts.length - 1];

const slides = slideDeck.getSlides();
if (slides.length >= 2) {
const targetSlide = slides[1];

targetSlide.insertImage(
currentChart.getBlob(),
250, 50, 450, 300
);
}

tempSheet.removeChart(currentChart);

slideDeck.saveAndClose();
Logger.log(`Đã tạo thành công: ${presentationName}`);
});
}

6. Key Design Considerations

🔹 Data Mapping Design

  • Mapping is based on column headers:
{{TITLE}} → TITLE column  
{{MODULE_NAME}} → MODULE_NAME column
{{PASSED}} → PASSED column

👉 Advantage:

  • No hardcoding
  • Easily scalable

🔹 Placeholder Naming Rules

  • Format: {{NAME}}
  • Must exactly match column headers
  • Case-sensitive

🔹 Handling Missing Data

const value = row[i] || "N/A";

👉 Ensures:

  • No script failure
  • Clear fallback value

7. Generating 10+ Slides

  • Each row = 1 presentation
  • With 10 rows → 10 slide files generated automatically

8. KPI Table Integration (Requirement)

In addition to text replacement, the script:

  • Dynamically inserts a KPI table
  • Uses real data (TOTAL_CASES, PASSED, FAILED)

👉 This satisfies:


9. Output Result

After execution:

  • Files are generated in the output folder:
Test_Report_1
Test_Report_2
...

Each presentation includes:

  • Slide 1: Title + Module + Tester
  • Slide 2: KPI details + table

🎥 Demo Video: https://youtu.be/RJaaWxTkytM


10. Practical Use Case (Testing)

This solution can be applied to:

  • Test summary reports
  • Weekly QA reports
  • Client demo presentations

Benefits:

  • Saves significant time
  • Reduces manual errors
  • Improves consistency

11. Conclusion

By combining:

  • Google Sheets
  • Google Slides
  • Google Apps Script

👉 The slide creation process can be fully automated.

Gần đây Anthropic ra mắt Claude Managed Agents — một bộ API cho phép doanh nghiệp xây dựng và triển khai AI agent trên hạ tầng cloud mà không cần tự xây từ đầu. Nghe có vẻ kỹ thuật, nhưng ý tưởng đằng sau khá đơn giản: thay vì AI chờ bạn ra lệnh, agent tự chạy và tự xử lý công việc trong khi bạn làm việc khác.


Claude Managed Agents là gì?

Khác với cách dùng Claude thông thường — bạn hỏi, AI trả lời — Claude Managed Agents hoạt động theo cơ chế khác hoàn toàn: bạn định nghĩa nhiệm vụ một lần, agent tự chạy nhiều bước liên tiếp mà không cần bạn can thiệp. Đọc file, xử lý dữ liệu, gửi kết quả — tất cả tự động, có thể chạy hàng giờ liên tục. Nếu bị gián đoạn giữa chừng, nó tiếp tục đúng chỗ dở chứ không làm lại từ đầu.

Phần sandboxing, bảo mật, lưu trạng thái, xử lý lỗi — Anthropic lo hết. Developer chỉ cần định nghĩa agent làm gì, dùng công cụ gì và giới hạn ra sao. Đối tượng chính là doanh nghiệp và đội kỹ thuật muốn đưa AI agent vào quy trình thực tế mà không mất nhiều tháng xây hạ tầng từ đầu.


Khác Claude Code chỗ nào?

Cả hai đều là sản phẩm của Anthropic và đều liên quan đến tự động hóa, nên dễ nhầm. Nhưng bản chất khác nhau hoàn toàn.

Claude Code là công cụ — developer cầm lên dùng để viết code, sửa lỗi, bỏ xuống là dừng. Claude Managed Agents là nền tảng — bạn đặt nhiệm vụ vào rồi để agent tự chạy trong khi bạn làm việc khác.

 Claude CodeClaude Managed Agents
Bản chấtCông cụ viết và sửa codeNền tảng chạy agent tự động
Cần người điều khiển?Có — liên tụcKhông — agent tự chạy
Thời gian chạyTheo phiên làm việcHàng giờ liên tục
Phù hợp choCông việc cần tư duy từng bướcCông việc lặp lại, nhiều bước, kết quả rõ ràng

Ứng dụng thực tế

Notion dùng Managed Agents để tự động tóm tắt meeting notes và tạo action items. Sentry dùng để phân tích bug report và gợi ý hướng xử lý. Đây đều là những task lặp lại hàng ngày, tốn nhiều thời gian nhưng không đòi hỏi tư duy sáng tạo — đúng loại việc phù hợp nhất để giao cho agent.

Nhìn từ góc độ vận hành nội bộ, hai trường hợp tôi thấy tiềm năng rõ nhất:

Tuyển dụng: Mỗi đợt nhận 50-100 CV, agent có thể tự đọc từng file, đối chiếu với JD, phân loại đạt/không đạt, tự soạn và gửi email phản hồi. Người phụ trách chỉ cần duyệt danh sách shortlist cuối cùng thay vì xử lý thủ công từng hồ sơ.

Onboarding: Quy trình onboarding có nhiều bước, nhiều bên liên quan. Agent có thể tự gửi nhắc nhở đúng người đúng thời điểm, tự cập nhật trạng thái hoàn thành, tự báo cáo tiến độ — không cần ai theo dõi thủ công từng bước.


Cân bằng giữa tự động hóa và kiểm soát

Tiềm năng thì rõ. Nhưng có một điều tôi vẫn chưa thể bỏ qua: rủi ro khi agent tự động hoàn toàn mà thiếu kiểm soát của người.

Trong tuyển dụng, một CV tốt có thể bị lọc nhầm vì format khác thường — agent không nhận ra nhưng người đọc sẽ thấy ngay. Hay tệ hơn: agent đọc sai địa chỉ email rồi gửi nhầm cho người chưa nộp hồ sơ. Những lỗi nhỏ như vậy trong vận hành thủ công còn sửa được — nhưng khi agent đã tự gửi đi hàng loạt thì thiệt hại khó lường hơn nhiều.

Đó không phải lý do để không dùng. Nhưng là lý do để thiết kế quy trình có checkpoint — những điểm người thật phải xem lại trước khi agent tiếp tục bước tiếp theo.


Một góc nhìn khách quan

Claude Managed Agents không phải người tiên phong trong lĩnh vực này. OpenAI, Google, Amazon đều có dịch vụ tương tự và ra trước. Điểm Anthropic đang cạnh tranh là độ an toàn và khả năng xử lý ngữ cảnh phức tạp của Claude — điều quan trọng khi agent đụng vào dữ liệu nhạy cảm như hồ sơ ứng viên hay thông tin nội bộ.


Kết

Claude Managed Agents đánh dấu bước chuyển rõ ràng: từ AI hỗ trợ người làm việc sang AI tự vận hành quy trình. Với những task lặp lại, nhiều bước, kết quả rõ ràng — đây là hướng đi có giá trị thực tế.

Nhưng “tự động hóa” không có nghĩa là “bỏ mặc”. Câu hỏi không phải là có nên dùng không — mà là thiết kế quy trình thế nào để agent làm đúng việc của nó mà không tạo ra rủi ro mới.
Nguồn: claude.com/blog/claude-managed-agents