Tải file excel google sheet được tạo tự động trên bài viết blogspot

 Chắc chắn rồi! Có lẽ chúng ta cần điều chỉnh cách thức tải file hoặc kiểm tra toàn bộ quy trình để đảm bảo mỗi bước đều hoạt động chính xác. Dưới đây là cách tiếp cận khác để chắc chắn bạn có thể tải file Excel về từ dữ liệu JSON.


Mã HTML và JavaScript hoàn chỉnh


Hãy đảm bảo rằng bạn đã thêm thư viện xlsx vào trang của mình:

html
Copy
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tải về dữ liệu đã lọc</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.16.2/xlsx.full.min.js"></script>
</head>
<body>

<div id="data-container"></div>
<button id="download-button">Tải về dữ liệu đã lọc</button>
<span id="filter-id" style="display: none;">giá trị lọc của bạn</span>

<script>
    async function fetchData(filterValue) {
        try {
            const response = await fetch('https://script.google.com/macros/s/AKfycbx-yzMq8NuqSYZjsurXtU-EFFM_JCtd_1ySsgvX97vW8DnqeP7LHuE6nwBbPCpM_2CIPA/exec');
            if (!response.ok) {
                throw new Error('Network response was not ok');
            }
            const data = await response.json();
            displayData(data, filterValue);
            setDownloadLink(data, filterValue);
        } catch (error) {
            console.error('Fetch error: ', error);
        }
    }

    function displayData(data, filterValue) {
        let html = '<table border="1">';
        data.forEach(item => {
            if (item['bai'] === filterValue) { // Thay 'bai' bằng tên cột bạn muốn lọc
                html += '<tr>';
                html += `<td>${item['cot1']}</td>`;
                html += `<td>${item['cot2']}</td>`;    // Thay 'cot1' và 'cot2' bằng tên các cột bạn muốn hiển thị
                html += '</tr>';
            }
        });
        html += '</table>';
        document.getElementById('data-container').innerHTML = html;
    }

    function setDownloadLink(data, filterValue) {
        const filteredData = data.filter(item => item['bai'] === filterValue);

        const worksheet = XLSX.utils.json_to_sheet(filteredData);
        const workbook = XLSX.utils.book_new();
        XLSX.utils.book_append_sheet(workbook, worksheet, "FilteredData");

        const wbout = XLSX.write(workbook, { bookType: 'xlsx', type: 'binary' });

        function s2ab(s) {
            const buf = new ArrayBuffer(s.length);
            const view = new Uint8Array(buf);
            for (let i = 0; i < s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;
            return buf;
        }

        const blob = new Blob([s2ab(wbout)], { type: 'application/octet-stream' });
        
        const url = URL.createObjectURL(blob);
        
        const downloadButton = document.getElementById('download-button');
        downloadButton.onclick = () => {
            const a = document.createElement('a');
            a.href = url;
            a.download = 'filtered_data.xlsx';
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
        };
    }

    document.addEventListener('DOMContentLoaded', () => {
        const filterElement = document.getElementById('filter-id');
        const filterValue = filterElement ? filterElement.innerText.trim() : '';
        fetchData(filterValue);
    });
</script>

</body>
</html>

Giải thích:


  1. Thêm thư viện xlsx: Bạn đã thêm thư viện xlsx từ CDN vào phần <head>.
  2. Tạo Blob: Mã để chuyển đổi workbook thành Blob vẫn như trước.
  3. Sự kiện click:
    • Thay vì thiết lập trực tiếp href của nút tải, ta tạo một phần tử <a> tạm thời khi người dùng nhấn vào nút.
    • Khi người dùng nhấn vào nút, nó sẽ tạo URL từ Blob và thiết lập thuộc tính download vào phần tử <a>.
    • Sau đó, chúng ta tự động kích hoạt phần tử <a> để tải xuống file và xóa phần tử <a> ra khỏi DOM sau khi nó được click.

Bằng cách này, chúng ta tách biệt quá trình tải về file và đảm bảo rằng URL và thuộc tính download được thiết lập và kích hoạt chính xác mỗi khi người dùng nhấn vào nút tải về.

Hãy thử lại với mã trên và kiểm tra xem kết quả bạn nhận được. Nếu có vấn đề nào khác, cứ cho mình biết để mình có thể hỗ trợ thêm nhé!

0/Post a Comment/Comments

Ads1
Ads2