Đằng sau điều này (không quá nhiều tôi thừa nhận ...) funny câu hỏi là một câu hỏi thực sự về một workaround tôi sử dụng mà không thực sự hiểu làm thế nào nó hoạt động.Điều gì sẽ xảy ra khi tôi "ngủ" trong GAS? (thực hiện giới hạn thời gian giải quyết)
Lần đầu tiên một mô tả ngắn gọn về trường hợp sử dụng của tôi, tất cả điều này đang xảy ra trong một tài liệu ràng buộc UiApp hiển thị trong thanh bên:
tôi phải tạo ra và gửi qua email một vài trăm tài liệu trong một ứng dụng mail merge viết bằng GAS. Phải mất tất nhiên quá dài để được xử lý trong một lô mà không đạt đến giới hạn thời gian thực hiện 5 phút vì vậy tôi đã thử một vài cách giải quyết khác nhau để hoàn thành công việc:
- sử dụng dấu thời gian (được lưu trữ trong ScriptProperties) khi Tôi bắt đầu quá trình và khi tôi đạt đến giá trị được xác định trước gần giới hạn, tôi lưu trữ các giá trị hiện tại (con trỏ, vars hữu ích ...) và quay lại giao diện người dùng yêu cầu người dùng tiếp tục (hoặc không). Điều đó hoạt động khá tốt nhưng cần một hành động của con người để hoàn thành toàn bộ nhiệm vụ.
- Vì vậy, tôi thiết lập giải pháp bằng trình kích hoạt bộ hẹn giờ mà tôi tạo trong cuộc gọi trình xử lý đầu tiên và trình kích hoạt này gọi hàm tạo/gửi tài liệu. Điều này cũng hoạt động tốt nhưng hàm trigger được gọi là không thể tương tác với giao diện người dùng vì dường như chỉ có các hàm xử lý mới có thể cập nhật giao diện người dùng. Vấn đề là tôi không thể hiển thị tiến trình cũng như không dễ dàng hiển thị khi quá trình kết thúc. Sau đó, tôi nhớ một ứng dụng nhỏ đã viết một số thời gian trước đây chỉ để cho vui: đó là một bộ đếm thời gian sử dụng một hộp kiểm như một trình kích hoạt trình xử lý máy chủ (từ một ý tưởng được đề xuất từ lâu bởi Romain Vialard trên diễn đàn cũ của Google) và quyết định để thử mẹo này trong quá trình gửi thư của tôi.
Nó hoạt động hoàn hảo, tôi xử lý 40 lô tài liệu là mỗi cuộc gọi (trong khoảng 3 phút) sau đó tạm dừng một lúc và bắt đầu lại cho đến khi hoàn thành. Mỗi cuộc gọi được kích hoạt bởi trình quản lý máy chủ được liên kết hộp kiểm, hộp kiểm tự thay đổi trong hàm xử lý, tạo trình kích hoạt của riêng nó theo cách này.
Câu hỏi của tôi (cuối cùng ;-) là: biết rằng toàn bộ quá trình có thể mất 30 đến 60 phút chính xác như thế nào là có thể? Làm cách nào/tại sao các chức năng xử lý máy chủ này được coi là nhiều quá trình vì chúng được tạo từ bên trong chính hàm?
Tôi hy vọng tôi đủ rõ ràng, (mà tôi nghi ngờ vì nó là một chút nhầm lẫn trong tâm trí của tôi :-)
tôi tham gia dưới đây mã của ứng dụng thử nghiệm đồng hồ mà đã cho tôi ý tưởng, nó có thể sẽ giúp mọi thứ dễ hiểu hơn.
function doGet() {
var app = UiApp.createApplication().setTitle('Counter/Timer');
var Panel = app.createAbsolutePanel().setStyleAttribute('padding','35');
var counter = app.createHTML().setId('counter').setHTML('<B>Timer = wait</B>').setStyleAttribute('fontSize','40px');// set start display
var clo = app.createTextBox().setName('clo').setId('clo').setValue('0').setVisible(false);//set start value in seconds
var handler1 = app.createServerHandler('doSomething').addCallbackElement(Panel);
var chk1 = app.createCheckBox('test1').addValueChangeHandler(handler1).setVisible(true).setId('chk1').setVisible(false);
app.add(Panel.add(chk1).add(counter).add(clo));
chk1.setValue(true,true);// start the process
return app}
function doSomething(e) {
var app = UiApp.getActiveApplication();
var xx = Number(e.parameter.clo);
var disp = app.getElementById('counter')
xx++ ;// replace by xx-- to count downwards
if(xx>600){ // 10 minutes timeout for example
disp.setHTML('<B> GAME OVER ;-)</B>').setStyleAttribute('fontSize','80px').setStyleAttribute('color','RED')
return app
}
var cnt = app.getElementById('clo').setValue(xx)
disp.setHTML('<B>'+T(xx)+'</B>')
Utilities.sleep(1000); // instead of sleeping do something !
// below comes the "active" part
var chk1 = app.getElementById('chk1').setValue(false,false)
var chk1 = app.getElementById('chk1').setValue(true,true)
return app;
}
function T(val){
var min = parseInt(val/60);
var sec = val-(60*min);
if(sec<10){sec='0'+sec}
if(min<10){min='0'+min}
var st = '> '+min+':'+sec
return st
}
Trong khi câu hỏi này sử dụng Dịch vụ giao diện người dùng không dùng nữa, bạn có thể thực hiện cùng một hiệu ứng bằng cách sử dụng Dịch vụ HTML. [Bruce McPherson đã viết blog về nó.] (Http://ramblings.mcpher.com/Home/excelquirks/htmlservice/parallel) – Mogsdad