2013-04-07 2 views
0

Привет всем, это моя первая публикация здесь, как правило, я нахожу ответы здесь, но на этот раз я должен был спросить.Избегание Превышено максимальное время выполнения при попытке скопировать файлы

Итак, я пытаюсь создать 12 папок с именами месяцев и создать 31 файл в каждом из них, файлы - это копия существующего файла электронной таблицы.

I'v удалось написать сценарий, который работает, но после создания 3-4 месяцев он останавливается и бросает «Превышено максимальное время выполнения», теперь я прочитал и понял, что существует ограничение по времени примерно на 5 минут - и как вы можете видеть в коде ниже, мой способ делать вещи не самый эффективный, может быть, теперь единственная идея, которую я получил, - сохранить исходные данные файла внутри blob, а затем прочитать из этого блоба при создании новых файлов - таким образом избегая большого количества вызовов и делая вещи быстрее, но когда я попытался создатьFile (blob), я получаю PDF в качестве вывода, что не является моим намерением.

function create_months(month_name) 
{ 

    var testingfolder = DocsList.getFolder("testing"); 
    var targetFolder = testingfolder.createFolder(month_name); 
    var mainDoc = DocsList.getFileById('original file id'); 

    for(var i=1;i<32;i++) 
    { 
    mainDoc.makeCopy(i).addToFolder(targetFolder); 

    var root = DocsList.getRootFolder(); 
    var file = root.find(i); 
    file[0].removeFromFolder(root); 
    } 


} 
//array of months in hebrew 
year = ['ינואר','פברואר','מרץ','אפריל','מאי','יוני','יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר']; 


function create(){ 

    for(var i=0;i<=12;i++) 
    { 
    create_months(year[i]); 
    } 
} 

Заранее спасибо :)

ответ

0

Ваш код кажется нормально, в стороне от «ошибки на 1» на вашем цикле в функции create (она должна быть я i < 12, не <=. Если сценарий когда-либо получил в конце концов вы бы undefined месяц, как ваш month_name на create_months.

Если вы сказали 3-4 месяца работы, я рекомендую вам сделать только 3 месяца во время. Если вы используете это вручную. Самое простое решение просто ждать, затем снова запускать, затем снова и т. д. e. г.

function create1stQuarter() { 
    for(var i = 0; i < 3; ++i) 
    create_months(year[i]); 
} 

function create2ndQuarter() { 
    for(var i = 3; i < 6; ++i) 
    create_months(year[i]); 
} 

function create3rdQuarter() { 
    for(var i = 6; i < 9; ++i) 
    create_months(year[i]); 
} 

function create4thQuarter() { 
    for(var i = 9; i < 12; ++i) 
    create_months(year[i]); 
} 

Теперь, если вы не используете это в редакторе сценария самостоятельно, или вам трудно для ваших пользователей нажмите 4 itens в меню таблицы или в другом месте. Вы можете улучшить это, автоматически установив триггер и автоматически удалив его, когда закончите. Вы также должны отслеживать внутри скрипта, на каком квартале вы должны создать следующий. Хорошим местом для чего-то такого простого является ScriptProperties.

Если вы используете решение триггера, я также рекомендую вам не устанавливать интервал времени менее 10 минут, так как вы рискуете своими работами одновременно. Если вы это сделаете, рекомендуется использовать LockService, чтобы гарантировать, что этого не произойдет.

+0

спасибо за подробный ответ - вот как я это сделал в конце концов, подумал, что лучше использовать blobs: <, но это отлично работает. –

0

Сделайте то, что вы можете за пределами цикла, и избавитесь от поиска, так как у вас уже есть файл.

var root = DocsList.getRootFolder(); 

for(var i=1;i<32;i++) 
    { 
    var daily = mainDoc.makeCopy(i); 
    daily.addToFolder(targetFolder); 
    daily.removeFromFolder(root); 
    } 

Это должно ускорить процесс.

Смежные вопросы