Tạo nút Print với form từ google sheet

Liên hệ QC

doanlong49

Thành viên chính thức
Tham gia
12/7/13
Bài viết
61
Được thích
25
Tôi có tạo 1 nút lệnh để in form từ google sheet, như khi tôi viết code để in ra pdf hoặc trực tiếp ra máy in thì có vấn đề. Vậy xin cho hỏi có cách nào in được form từ google sheet thông qua nút button print?.

Các bạn có thể truy cập vào đường link bên dưới

Google Sheet


Do Script app không share được nên tôi copy code lên mô tả trong cửa sổ script như sau

Code.gs

JavaScript:
function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

Index.html

HTML:
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
     Hello, World!
    <input type="button" value="Print"/>
  </body>
</html>





Pic.JPG

Pic1.JPGPic2.JPG
 
Xem trong file nhé. Nhấn F5, rồi xem Menu Print ở cuối.
Tôi đang sử dụng deploy as web app không phải làm trực tiếp từ menu của google sheet nên 2 cái đó là khác nhau xa!. Có nghĩ là khi tôi nhấn vào button print ở hình 3 sẽ in ra được form ở Sheet Form. Nó nghiên về kỹ thuật thiết kế web với database là google sheet
 
Tôi đang sử dụng deploy as web app không phải làm trực tiếp từ menu của google sheet nên 2 cái đó là khác nhau xa!. Có nghĩ là khi tôi nhấn vào button print ở hình 3 sẽ in ra được form ở Sheet Form. Nó nghiên về kỹ thuật thiết kế web với database là google sheet
Chưa hiểu ý lắm. Vậy viết cái function in đi, rồi gán vào nút bên html.
 
Chưa hiểu ý lắm. Vậy viết cái function in đi, rồi gán vào nút bên html.

Đúng rồi đó @befaint nhưng tôi chưa biết cách viết sao để nó hiểu là khi nhấn vào đó (nút button print trên html) sẽ in form từ google sheet ra pdf hoặc tới trực tiếp máy in đã kết nối trên máy tính, tôi có tham khảo các trang của nước ngoài thì thấy nói không được phải lưu vào google drive mới được
 
In hay không chưa bàn tới. Ta bàn về
Tôi đang sử dụng deploy as web app không phải làm trực tiếp từ menu của google sheet
Tức bạn có script app?. Bạn hình dung thao tác thế nào?
Trước hết bạn mở google sheets (Test) không có code (tức Tools -> Editor script -> trắng tinh) rôi sau đó lại chạy script app. Tiếp theo nhấn nút Print. Và bạn muốn code phải tìm xem có google sheets nào đang mở để in vùng đang chọn? Có lẽ không phải như thế.

Nếu bạn muốn in vùng đang chọn trong sheet cụ thể của tập tin cụ thể thì không có script app nảo cả. Lúc đó làm như befaint nói. Tức Tools -> Editor script -> viết code. Tức không có chuyện
Tôi đang sử dụng deploy as web app không phải làm trực tiếp từ menu của google sheet
 
In hay không chưa bàn tới. Ta bàn về

Tức bạn có script app?. Bạn hình dung thao tác thế nào?
Trước hết bạn mở google sheets (Test) không có code (tức Tools -> Editor script -> trắng tinh) rôi sau đó lại chạy script app. Tiếp theo nhấn nút Print. Và bạn muốn code phải tìm xem có google sheets nào đang mở để in vùng đang chọn? Có lẽ không phải như thế.

Nếu bạn muốn in vùng đang chọn trong sheet cụ thể của tập tin cụ thể thì không có script app nảo cả. Lúc đó làm như befaint nói. Tức Tools -> Editor script -> viết code. Tức không có chuyện

Cảm ơn @batman1, thật sự tôi viết code tất cả nằm trong Apps Script ở đây là file TestScript (xem hình bên dưới cách tạo Apps Script), do tôi share lên diễn đàn sợ các bạn không truy cập được vào code ví dụ nên tôi bỏ code qua spreadsheet file TestGAS. Thật ra là tất cả code tôi viết trong TestScript khi tôi Pushlish Deloy as web app và run code sẽ hiện lên web script app có chữ như hình cuối cùng ở bài 1 là Hello world và nút Print. Khi đó tôi nhấn nút print này nó sẽ tìm tới file Speadsheet được chỉ định trong google drive ở đây tôi ví dụ là file TestGAS với sheet Form khi đó xảy ra 2 trường hợp:
Trường hợp 1: là nó sẽ tạo ra file pdf và hỏi người dùng chỗ lưu
Trường hợp 2: là nó sẽ tìm tới máy in kết nối trên máy tính in ra trực tiếp hoặc hỏi chọn máy in muốn in (nếu được)

Đính kèm hình cách tạo Apps Script

Capture1.JPG
 
Đúng rồi đó @befaint nhưng tôi chưa biết cách viết sao để nó hiểu là khi nhấn vào đó (nút button print trên html) sẽ in form từ google sheet ra pdf hoặc tới trực tiếp máy in đã kết nối trên máy tính, tôi có tham khảo các trang của nước ngoài thì thấy nói không được phải lưu vào google drive mới được
PHP:
// code in Code.gs

fucntion printGoogleSheets(){
    // Code to print Google Sheets
    var ui = SpreadsheetApp.getUi();
    ui.alert("Printed!");
}

// code in Index.html

<body>
  <h1>Run function from Google script</h1>
  <button id="btn-print">Print</button>
  <script>
    document.getElementById("btn-print").addEventListener("click", clickPrint);

    function clickPrint(){
      google.script.run.printGoogleSheets();
    }
  </script>
</body>
 
Khi đó tôi nhấn nút print này nó sẽ tìm tới file Speadsheet được chỉ định trong google drive ở đây tôi ví dụ là file TestGAS với sheet Form khi đó xảy ra 2 trường hợp:
Ai chỉ định, cái gì chỉ định? Trong HTML chỉ có mỗi nút Print, tên tập tin lấy từ đâu, địa chỉ vùng cần in lấy từ đâu?

Mô tả kiểu nửa vời như thế rồi cùng nhau đoán mò?

1. Phải chăng là code chỉ in cho vùng cố định, cho tập tin cố định? Nếu thế thì tôi lặp lại cẫu hỏi: Tại sao phải là script app với HTML kia?

2. Nếu code dùng để in tập tin bất kỳ thì lôgíc là phải có chỗ nhập tên tập tin, hoặc tạo danh sách để chọn từ danh sách. Nếu không thì lấy tên tập tin từ trên trời à?

3. Code của befaint thì quá đơn giản. Nhưng tôi e rằng bạn bí chủ yếu ở chỗ không biết thay ui.alert("Printed!") bằng cái gì. Vì ui.alert("Printed!") rõ ràng không làm cái mà bạn muốn. Bạn phải viết code cụ thể thay cho ui.alert("Printed!"). Và bạn bí chủ yếu ở chỗ viết code làm việc của bạn thay cho dòng vd. đơn giản ui.alert("Printed!")?
 
Ai chỉ định, cái gì chỉ định? Trong HTML chỉ có mỗi nút Print, tên tập tin lấy từ đâu, địa chỉ vùng cần in lấy từ đâu?
Ở đây tập tin tôi lấy từ đường dẫn cố định, và vùng in là từ sheet form từ B2 : D6

1. Phải chăng là code chỉ in cho vùng cố định, cho tập tin cố định? Nếu thế thì tôi lặp lại cẫu hỏi: Tại sao phải là script app với HTML kia?
Vì tôi cần cái cơ bản HTML kia là đủ.

JavaScript:
function printGoogleSheets(){
    //Đường dẫn tới tập tin là cố định
    var url = "https://docs.google.com/spreadsheets/d/1j5DmY-a_9KfRDN1yU-4UU55-C5B7yzApDzpDzMd42gc/edit#gid=0";
    // Mở file cần in
    var ss = SpreadsheetApp.openByUrl(url);
    // Mở sheet cần in
    var ws =ss.getSheetByName("Form");
    
}
@befaint Tôi muốn viết 1 script app chạy độc lập, nó không nằm trong script của spreadsheet google!

Tôi đang bị vướng ở chỗ viết function printGoogleSheet, còn các vấn đề khác tôi xử lý được. Nếu có vấn đề gì @befaint @batman1 không rõ tôi sẽ giải thích thêm!
 
Ở đây tập tin tôi lấy từ đường dẫn cố định, và vùng in là từ sheet form từ B2 : D6


Vì tôi cần cái cơ bản HTML kia là đủ.

JavaScript:
function printGoogleSheets(){
    //Đường dẫn tới tập tin là cố định
    var url = "https://docs.google.com/spreadsheets/d/1j5DmY-a_9KfRDN1yU-4UU55-C5B7yzApDzpDzMd42gc/edit#gid=0";
    // Mở file cần in
    var ss = SpreadsheetApp.openByUrl(url);
    // Mở sheet cần in
    var ws =ss.getSheetByName("Form");
 
}
@befaint Tôi muốn viết 1 script app chạy độc lập, nó không nằm trong script của spreadsheet google!

Tôi đang bị vướng ở chỗ viết function printGoogleSheet, còn các vấn đề khác tôi xử lý được. Nếu có vấn đề gì @befaint @batman1 không rõ tôi sẽ giải thích thêm!
Thì nhờ có bài của tôi mà bây giờ mới có function printGoogleSheets, và biết được bạn cần in cho tập tin nhất định, cho vùng cho trước. Bạn nói "chỉ định" thì ai mà biết chỉ định bằng cách nào.
Nếu đã có function printGoogleSheets rồi thì tôi nghĩ bây giờ chỉ còn chuyện viết code để in PDF thôi. Tôi đoán đúng là bạn bí khâu này.
Tôi sẽ thử xem thế nào.

Câu hỏi cuối cùng. Trong sheet Form ngoài vùng B2: D6 thì còn các dữ liệu khác không? Vì nếu không có bất kỳ dữ liệu ở các vùng khác thì chỉ cần in toàn bộ sheet. Nhưng nếu có dữ liệu khác thì không thể in toàn bộ sheet được.
 
Lần chỉnh sửa cuối:
Nếu đã có function printGoogleSheets rồi thì tôi nghĩ bây giờ chỉ còn chuyện viết code để in PDF thôi. Tôi đoán đúng là bạn bí khâu này.
@batman1 Đúng rồi thật sự tôi bị bí khâu này in pdf hoặc ra máy in trực tiếp.

Câu hỏi cuối cùng. Trong sheet Form ngoài vùng B2: D6 thì còn các dữ liệu khác không? Vì nếu không có bất kỳ dữ liệu ở các vùng khác thì chỉ cần in toàn bộ sheet. Nhưng nếu có dữ liệu khác thì không thể in toàn bộ sheet được.
Trong sheet Form chỉ có form cần in ngoài ra không có bất cứ dữ liệu nào khác.
 
@batman1 Đúng rồi thật sự tôi bị bí khâu này in pdf hoặc ra máy in trực tiếp.


Trong sheet Form chỉ có form cần in ngoài ra không có bất cứ dữ liệu nào khác.
Bạn thử code sau xem sao.
Mã:
function printGoogleSheets(){
    //Đường dẫn tới tập tin là cố định
    var url = "https://docs.google.com/spreadsheets/d/1j5DmY-a_9KfRDN1yU-4UU55-C5B7yzApDzpDzMd42gc/edit#gid=0";
    // Mở file cần in
    var ss = SpreadsheetApp.openByUrl(url);
    // Mở sheet cần in
    var ws =ss.getSheetByName("Form");
    ss.setActiveSheet(ws)
    ss.moveActiveSheet(1)
    var blob = ss.getAs('application/pdf').setName(ss.getName())
      var pdfFile = DriveApp.createFile(blob)
      const htmlOutput = HtmlService
        .createHtmlOutput('<p>Hay nhan de mo <a href="' + pdfFile.getUrl() + '" target="_blank">' + ss.getName() + '</a></p>')
        .setWidth(300)
        .setHeight(80)
      SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Xuat PDF thanh cong')
}
 
Bạn thử code sau xem sao.
Mã:
      SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Xuat PDF thanh cong')

@batman1 hiện tai chỉ còn lỗi chỗ đó nó không popup được thông báo để người dùng click vào đường dẫn để in pdf do code trên nó chỉ hiểu trong script apps của google spreadsheets, cái này tôi sẽ nghiên cứu sau sẽ tạo popup trên hoặc tạo thành hyperlink text web app.
Còn 1 vấn đề hiện tại pdf lưu mặc định trên MyDrive vậy tôi muốn chuyển sang 1 folder nào đó trên trên Mydrive thì làm cách nào? Chẳng hạn MyDrive/PrintPDF.
Xin cảm ơn
 
@batman1 hiện tai chỉ còn lỗi chỗ đó nó không popup được thông báo để người dùng click vào đường dẫn để in pdf do code trên nó chỉ hiểu trong script apps của google spreadsheets, cái này tôi sẽ nghiên cứu sau sẽ tạo popup trên hoặc tạo thành hyperlink text web app.
Đằng nào bạn cũng test, vậy bạn thử code mới xem.

Trong cửa sổ nhẩy ra do window.open(text, '_blank') bạn có nút IN và nút TẢI VỀ

index.html
Mã:
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
     Hello, World!
    <button class="action" style="width:200px;height:40px" onclick="google.script.run
               .withSuccessHandler(showpdf)
               .withFailureHandler(onFailure)
               .printGoogleSheets();">Print</button>
  </body>
<script type="text/javascript">
    function showpdf(text, t) {
        window.open(text, '_blank');
    }
    function onFailure(error) {
        alert(error.message);
    }
</script>
</html>

code.gs
Mã:
function doGet() {
   return HtmlService.createHtmlOutputFromFile('index');
}

function printGoogleSheets(){
    //Đường dẫn tới tập tin là cố định
    var url = "https://docs.google.com/spreadsheets/d/1j5DmY-a_9KfRDN1yU-4UU55-C5B7yzApDzpDzMd42gc/edit#gid=0";
    // Mở file cần in
    var ss = SpreadsheetApp.openByUrl(url);
    // Mở sheet cần in
    var ws =ss.getSheetByName("Form");
    ss.setActiveSheet(ws)
    ss.moveActiveSheet(1)
    var blob = ss.getAs('application/pdf').setName(ss.getName())
      var pdfFile = DriveApp.createFile(blob)
      return pdfFile.getUrl()
}
Còn 1 vấn đề hiện tại pdf lưu mặc định trên MyDrive vậy tôi muốn chuyển sang 1 folder nào đó trên trên Mydrive thì làm cách nào? Chẳng hạn MyDrive/PrintPDF.
Xin cảm ơn
Cái này tôi ..................... chưa biết :D
 
@batman1 code trên đã hoạt động tốt. Xin cảm ơn @batman1
Nhân đây tôi cũng xin tóm tắt, có thể các bạn đọc ở trên có thể hiểu tại sao tôi không viết script tạo nút in trực tiếp trên google spreadsheet.
Thứ nhất là do nhu cầu của tôi đang muốn sử dụng script để tạo web app, không phải sử dụng script để tạo user interface.
Thứ hai là do tôi muốn sử dụng script này có thể ở các file khác dễ dàng, giữa script web app và script user interface có thể nói là giống nhau 9-10

Cái này tôi ..................... chưa biết :D
Sao khi tìm hiểu tôi cũng biết cách đổi đường dẫn lưu file như sau, do tôi muốn các file pdf để cùng folder PrintPDF nên tôi cần chuyển chúng vào đây còn không thì các bạn cứ giữ nguyên các đoạn code trên

JavaScript:
 var blob = ss.getAs('application/pdf').setName(ss.getName())
 var pdfFile = DriveApp.getFolderById('1ApBEbt2OW7I5bgpVYg5Hx6Y2qw1BgF0k').createFile(blob)
Với FolderById Các bạn có thể tìm thấy trên browser của trình duyệt web các bạn có thể xem hình ở bên dưới đoạn tôi tô màu vàng

Capture.JPG
 
@batman1 code trên đã hoạt động tốt. Xin cảm ơn @batman1
Nhân đây tôi cũng xin tóm tắt, có thể các bạn đọc ở trên có thể hiểu tại sao tôi không viết script tạo nút in trực tiếp trên google spreadsheet.
Thứ nhất là do nhu cầu của tôi đang muốn sử dụng script để tạo web app, không phải sử dụng script để tạo user interface.
Thứ hai là do tôi muốn sử dụng script này có thể ở các file khác dễ dàng, giữa script web app và script user interface có thể nói là giống nhau 9-10


Sao khi tìm hiểu tôi cũng biết cách đổi đường dẫn lưu file như sau, do tôi muốn các file pdf để cùng folder PrintPDF nên tôi cần chuyển chúng vào đây còn không thì các bạn cứ giữ nguyên các đoạn code trên

JavaScript:
 var blob = ss.getAs('application/pdf').setName(ss.getName())
var pdfFile = DriveApp.getFolderById('1ApBEbt2OW7I5bgpVYg5Hx6Y2qw1BgF0k').createFile(blob)
Với FolderById Các bạn có thể tìm thấy trên browser của trình duyệt web các bạn có thể xem hình ở bên dưới đoạn tôi tô màu vàng

View attachment 225579
bác ơi cho em hỏi chút
 
Câu hỏi cuối cùng. Trong sheet Form ngoài vùng B2: D6 thì còn các dữ liệu khác không? Vì nếu không có bất kỳ dữ liệu ở các vùng khác thì chỉ cần in toàn bộ sheet. Nhưng nếu có dữ liệu khác thì không thể in toàn bộ sheet được.

Giả sử ngoài vùng B2 : D6 còn dữ liệu khác nữa thì code như thế nào anh?
 
Mình có button chuyển dữ liệu trên google sheet. Mình muốn lồng thêm gọi lệnh in mà không biết làm thế nào.
Cụ thể ý mình muốn là nhập liệu vào phiếu => nhấn button => chuyển dữ liệu qua sheet data đồng thời gọi lệnh in lên
 
Bài viết của bạn và hướng dẫn của batman1 quá hữu ích!
Mình không rành về CODE, nhưng xem bài của mọi người mình có kết hợp làm thấy rất hay. Nhưng mình làm thì nó in hết các sheet có trong file.
Nhờ các bạn hướng dẫn thêm giúp mình. Cách in nội dung sheet chỉ định, khi xuất PDF cho mình đặt tên file, nếu có thể cho mình chọn cùng lưu file PDF.
Cảm ơn các bạn nhiều!
Link Google sheet: Link
JavaScript:
function onOpen( ){
// This line calls the SpreadsheetApp and gets its UI 
// Or DocumentApp or FormApp.
  var ui = SpreadsheetApp.getUi();
 
//These lines create the menu items and
// tie them to functions we will write in Apps Script
 
 ui.createMenu('Xuất PDF')
      .addItem('Chạy lệnh xuất PDF', 'printGoogleSheets')
      .addToUi();
}
function course01() {
  Browser.msgBox("Chào mừng đến với khóa học");
}
function printGoogleSheets(){
    //Đường dẫn tới tập tin là cố định
    var url = "https://docs.google.com/spreadsheets/d/1mSFaRDl__mbOfCmiggTYj8pQe4AKCCIbvGR_mTqQJ-w/edit#gid=69133019";
    // Mở file cần in
    var ss = SpreadsheetApp.openByUrl(url);
    // Mở sheet cần in
    var ws =ss.getSheetByName("DATA");
    ss.setActiveSheet(ws)
    ss.moveActiveSheet(1)
    var blob = ss.getAs('application/pdf').setName(ss.getName())
          var pdfFile = DriveApp.getFolderById('1UUFuIg3nqSOBvNtpxKX-LxHTu_2TexPc').createFile(blob)
      const htmlOutput = HtmlService
        .createHtmlOutput('<p>Hay nhan de mo <a href="' + pdfFile.getUrl() + '" target="_blank">' + ss.getName() + '</a></p>')
        .setWidth(300)
        .setHeight(80)
      SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Xuat PDF thanh cong')
}
 
Web KT
Back
Top Bottom