2014-10-02 4 views
0

Прежде всего, я не программист, поэтому это может быть легко один для некоторых из вас ...В листе Google добавьте 1 к значению ячейки и сохраните результат как PDF-файл в Google Диске, добавьте 1 снова и сохраните PDF снова,

Я составляю Лист Google для оценки детей в начальной школе. Я сделал таблицу таким образом, что если вы вводите номер класса ученика в ячейке H3, оценки этого ученика появляются на листе. Все идет нормально.

Теперь, что я пытаюсь сделать, это написать сценарий, который добавляет 1 к значению ячейки H3, а затем сохраняет PDF-файл в Google Диске учителя.

На данный момент у меня есть «сценарий», который я скопировал и вставил из Интернета ... Я обнаружил, что мне нужно скрыть все листы, которые мне не нужны в PDF. (Вот что такое функция ShowOneSheet и ShowAllSheets).

Возможно, код очень неэффективен, я понятия не имею. :)

На данный момент у меня есть меню, в котором вы можете делать все вручную. (перейдите к следующему ученику, сохраните в pdf-диске, перейдите к следующему ученику, сохраните в pdf на диске, ...)

Я хочу, чтобы сценарий делал это столько раз, сколько есть ученики. Таким образом, учителя могут получить отчет для всех учащихся на своем Google диске всего одним щелчком мыши.

Я также не знаю, как создать папку/pdf с указанным именем. (на данный момент он сохраняет как папку, так и PDF как «неопределенные».)

Любая помощь будет очень признательна! Я манекен, но хочу учиться.

function onOpen() { 
var ui = SpreadsheetApp.getUi(); 
ui.createMenu('Reports') 
    .addItem('Show only grades sheet', 'showOneSheet') 
    .addItem('Go to next report', 'nextclassnr') 
    .addItem('Save this report in PDF in Drive', 'createPdf') 
    .addItem('Show all sheets', 'showAllSheets') 
    .addToUi(); 
} 
function showOneSheet(SheetToShow) { 
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 
for(var i in sheets){ 
if (sheets[i].getName()==SheetToShow){ 
    sheets[i].showSheet(); 
} 
else { 
    sheets[i].hideSheet(); 
} 
} 
} 




function nextclassnr() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheets()[3]; 
//Set variables and add one to the "classnumber" 
var classnrR= sheet.getRange("H3"); 

var classnr = classnrR.getValue(); 
var nextclassnr = 1 + classnr; 

classnrR.setValue(nextclassnr); 


} 



//PDF in folder "undefined" named "undefined" :(

    function createPdf(saveToFolder, fileName){ 

var ssa = SpreadsheetApp.getActiveSpreadsheet(); 
var pdf = ssa.getAs("application/pdf"); 
try { 
    var folder = DocsList.getFolder(saveToFolder); 
} 
//Create Folder if not exists 
    catch(error){ 
    folder = DocsList.createFolder(saveToFolder); 
    } 
var file = folder.createFile(pdf); 
file.rename(fileName); 

return file; 
} 


// make sheets visible 

function showAllSheets() { 
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 
for(var i in sheets){ 
    sheets[i].showSheet(); 
} 
} 

ответ

1

Here you can find the result of the spreadsheet with the code attached. Я использовал код Эндрю Робертс дал мне и пришлось изменить некоторые части и биты.

Здесь вы также можете найти код я использовал в сценарии:

//EVENT HANDLERS 
//------------------ 



// MAKE MENU 
//------------ 
function onOpen() { 
var ui = SpreadsheetApp.getUi(); 
ui.createMenu('Reports') 
// .addItem('Werkbladen verbergen', 'showOneSheet') 
// .addItem('Alle werkbladen tonen', 'showAllSheets')  
    .addItem('Show next report', 'nextClassNumber') 
    .addItem('Show report of number...', 'showReportClassNumber') 
    .addSeparator() 
     .addSubMenu(ui.createMenu('Process reports') 
      .addItem('Process all reports', 'processAllStudents') 
      .addItem('Process report of number...', 'processOneStudent') 
       ) 
     .addToUi(); 
} 





// SHOW ONLY ONE SHEET 
//------------------------ 
function showOneSheet() { 
    var SheetToShow = ("RAPPORT") 
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 
    for(var i in sheets){ 
    if (sheets[i].getName()==SheetToShow){ 
     sheets[i].showSheet(); 
    } 
    else { 
     sheets[i].hideSheet(); 
    } 
    }} 




// SHOW REPORT OF NUMBER... 
//------------------- 
function showReportClassNumber() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheets()[4]; 
    //Set variables and add one to the "classNumber" 
    var classNumberRange = sheet.getRange("classnumber"); 
    var classNumber = Browser.inputBox("Class number","What is the number of the student you would   like to see?",Browser.Buttons.OK); 
    classNumberRange.setValue(classNumber); 

} 



    // NEXT CLASSNUMBER 
    //------------------- 
function nextClassNumber() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheets()[4]; 
    //Set variables and add one to the "classNumber" 
    var classNumberRange = sheet.getRange("I4"); 
    var classNumber = classNumberRange.getValue(); 
    var nextClassNumber = classNumber + 1; 

classNumberRange.setValue(nextClassNumber); 

} 






// EXPORT CURRENT REPORT TO PDF 
//---------------------------------- 
    function createPdf(classnrR,sheet){ 
// saveToFolder, fileName 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheets()[4]; 
    var ssa = SpreadsheetApp.getActiveSpreadsheet(); 
    var pdf = ssa.getAs("application/pdf"); 
    var folders; 
    var nextFolder; 
    var foundFolder = false; 
    var classNumber = sheet.getRange("classnumber").getValue(); 

    var CLASS_NAME_RANGE = sheet.getRange("klas") 
    var CLASS_NAME = CLASS_NAME_RANGE.getValue(); 
    var FOLDER_NAME = 'Rapporten ' + CLASS_NAME; 

    var FILE_NAME = "Rapport "+classNumber+".pdf"; 

    // DocList is deprecated 
    folders = DriveApp.getFoldersByName(FOLDER_NAME); 

    // See if we already have the folder 
    while (folders.hasNext()) { 

    if (!foundFolder) { 
     folders.next().createFile(pdf).setName(FILE_NAME); 
     foundFolder = true; 
    } else { 

     throw new Error('There are multiple folders with the name ' + FOLDER_NAME + '. Remove or rename them, please.'); 
    } 
    } 

    if (!foundFolder) { 

    // No folder already so create it 



    DriveApp 
    .createFolder(FOLDER_NAME) 
    .createFile(pdf) 
    .setName(FILE_NAME); 
    } 
} 







    // SHOW ALL SHEETS 
    //------------------------ 

function showAllSheets() { 
    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 
    for(var i in sheets){ 
     sheets[i].showSheet(); 
    } 
} 


// PROCESS ONE STUDENT 
//------------------------- 

function processOneStudent(){ 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheets()[4]; 
    var classNumberRange= sheet.getRange("classnumber"); 

    showOneSheet(); 

    var classNumber = Browser.inputBox("Class number","What class number would you like to process the report of?",Browser.Buttons.OK); 
    classNumberRange.setValue(classNumber); 

    createPdf(); 
    showAllSheets(); 
} 





// PROCESS ALL STUDENTS 
//---------------------------- 

function processAllStudents(){ 
//SHOW MESSAGE 
    SpreadsheetApp.getActiveSpreadsheet().toast('Find a folder in your Google Drive named RAPPORTEN and your class name.', 'Processing... Be patient', 15); 
    //Hide all sheets 
    showOneSheet() 
    //Go to the first report 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheets()[4]; 
    var aantalleerlingen = sheet.getRange("P4").getValue(); 
    var classNumberRange= sheet.getRange("I4"); 

    classNumberRange.setValue("0"); 

    // Go thrue all reports 
    for (i = 0 ;i <= aantalleerlingen; i++){ 
nextClassNumber(); 
createPdf(); 
    } 

    // Show all sheets 
showAllSheets(); 

    //Set classnumber back to "1" 
    classNumberRange.setValue("1"); 


    } 
1

Я переделывал свой код немного, и это делает то, что я думаю, что вы хотели, чтобы это сделать, не делая "Running его столько раз, сколько Есть студенты. Если бы вы могли объяснить это немного больше, или у меня есть created a sheet, вы можете обновить его, чтобы показать свою ситуацию, и это также связано с этим скриптом.

// Define your names here 

var FOLDER_NAME = 'PDFPlus1'; 
var FILE_NAME = FOLDER_NAME + ' - Student Grades - Class '; 

// Event handlers 
// -------------- 

function onOpen() { 

    var ui = SpreadsheetApp.getUi(); 

    ui.createMenu('Reports') 
    .addItem('Show only grades sheet', 'showGradesSheet') 
    .addItem('Go to next report', 'nextClassNumber') 
    .addItem('Save this report in PDF in Drive', 'createPdf') 
    .addItem('Show all sheets', 'showAllSheets') 
    .addItem('Create a report for each student', 'processAllStudents')   
    .addToUi(); 
} 

function showGradesSheet() { 

    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 

    // Grades sheet (?) 
    var SheetToShow = sheets[3]; 

    for (var i = 0; i < sheets.length; i++) { 

    if (sheets[i] === SheetToShow) { 

     sheets[i].showSheet(); 

    } else { 

     sheets[i].hideSheet(); 
    } 
    } 
} 

function nextClassNumber() { 

    var classNumberRange = getClassNumberRange_(); 
    var classNumber = classNumberRange.getValue(); 
    classNumber++; 
    classNumberRange.setValue(classNumber); 
} 

function createPdf(){ 

    // saveToFolder, fileName 

    var ssa = SpreadsheetApp.getActiveSpreadsheet(); 
    var pdf = ssa.getAs("application/pdf"); 
    var folders; 
    var nextFolder; 
    var foundFolder = false; 
    var classNumber = getClassNumberRange_().getValue(); 

    // DocList is deprecated 
    folders = DriveApp.getFoldersByName(FOLDER_NAME); 

    // See if we already have the folder 
    while (folders.hasNext()) { 

    if (!foundFolder) { 

     folders.next().createFile(pdf).setName(FILE_NAME + classNumber); 
     foundFolder = true; 

    } else { 

     throw new Error('multiple folders named ' + FOLDER_NAME); 
    } 
    } 

    if (!foundFolder) { 

    // No folder already so create it 
    DriveApp 
     .createFolder(FOLDER_NAME) 
     .createFile(pdf) 
     .setName(FILE_NAME + classNumber); 
    } 
} 

// Make sheets visible 

function showAllSheets() { 

    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 

    for (var i = 0; i < sheets.length; i++) { 

    sheets[i].showSheet(); 
    } 
} 

function processAllStudents() { 

    // Could easily call the other event handlers to automate the 
    // PDF creation, just need to call createPDF() with a student ID number 
    // rather than pulling it from the sheet 

    // for all students { 
    // createPDF(studentIdNumber); 
    // } 

}  

// Local functions 
// --------------- 

function getClassNumberRange_() { 

    return classNumberRange = SpreadsheetApp 
    .getActiveSpreadsheet() 
    .getSheets()[3] 
    .getRange("H3"); 
} 
+0

Привет, В Бельгии мы используем счеты с цифрами, чтобы дать оценки студентов ... (разные системы) Я заполнил лист Google с какая-то фиктивная информация, поэтому вы можете видеть, что я пытаюсь сделать здесь. Каждый студент получает «персонализированную» распечатку листа «Оценки». Итак, что я хочу сделать, так это то, что скрипт запускает «добавить 1 для изменения класса» И «сохранить PDF в Google Диске». Теперь вы уже много помогли мне. Думаю, я смогу справиться с этим самостоятельно. Я отправлю ссылку на лист и код, чтобы вы могли увидеть «конечный результат» моего маленького проекта или дать некоторые советы, если вы считаете, что это необходимо. Большое спасибо! –