2016-07-07 6 views
0

非常勤の勤務のために働くボスは、費用と請求書を承認するためのより良いシステムを導入したいと考えています。明らかに、オンラインでSaaSオプションを実行する方法はたくさんありますが、これらのコストはほぼすべてで、必要以上に複雑です。シンプルなGoogleフォームが理想的です。私たちはほとんどの仕事にGoogle Appsを使用しますが、ファイルを添付することはできません。だから私はGoogle Apps Scriptを発見し、私の道に私を助けたGoogleのページとここでいくつかの良い例を見つけました。Google Apps Script - シートを更新し、請求書/経費の電子メールを送信するウェブフォーム

私は私がやろうとしているかを説明した場合:

  • スタッフのメンバーが形になり、その詳細に費用の値 を置き、それがために何してファイルを添付(pdfまたは写真 通常)。

  • Googleが共有するgoogleドライブの のフォルダにこのファイルがアップロードされ、このファイルがアップロードされます。

  • それはまた、すべての これらの詳細及び各提出の状況、及び費用のコストに応じて、ドライブ

  • で ファイルへのリンクを含む共有スプレッドシートに記録されます、それを私たちのアカウント担当者にすぐに を電子メールで送信するか、支払う前に承認するために 上司に送信されます。

ここでは、フォームの送信に使用するスクリプトを作成して、ファイルを正しくアップロードしてシートに記録します。しかし、これをMailApp.sendEmail/GmailApp.sendEmail関数と組み合わせる方法を考えることはできません。

以下は動作するコードです。 Code.gsファイル:

var submissionSSKey = 'xxxxxxx'; 
var folderId = "xyxyxyx"; 


function doGet(e) { 
    var template = HtmlService.createTemplateFromFile('Form.html'); 
    template.action = ScriptApp.getService().getUrl(); 
    return template.evaluate(); 
} 


function processForm(theForm) { 
    var fileBlob = theForm.myFile; 
    var folder = DriveApp.getFolderById(folderId); 
    var doc = folder.createFile(fileBlob); 
    var template = HtmlService.createTemplateFromFile('Thanks.html'); 
    var name = template.name = theForm.name; 
    var reason = template.reason = theForm.reason; 
    var email = template.email = theForm.email; 
    var cost = template.cost = theForm.cost; 
    var payee = template.payee = theForm.payee; 
    var fileUrl = template.fileUrl = doc.getUrl(); 
    var threshold = 100; 

    if (cost > threshold) 
    { 
    var approval = "YES" 
    } 
    else 
    { 
    var approval = "NO" 
    } 
    var timestamp = new Date() 
    var sheet = SpreadsheetApp.openById(submissionSSKey).getSheets()[0]; 
    var lastRow = sheet.getLastRow(); 
    var targetRange = sheet.getRange(lastRow+1, 1, 1, 8).setValues([[timestamp,name,cost,payee,reason,approval,"Submitted",fileUrl]]); 

    // Return HTML text for display in page. 
    return template.evaluate().getContent(); 

} 

そしてForm.Htmlファイル:

<script> 
    // Javascript function called by "submit" button handler, 
    // to show results. 
    function updateOutput(resultHtml) { 
    toggle_visibility('inProgress'); 
    var outputDiv = document.getElementById('output'); 
    outputDiv.innerHTML = resultHtml; 
    } 

    // From blog.movalog.com/a/javascript-toggle-visibility/ 
    function toggle_visibility(id) { 
    var e = document.getElementById(id); 
    if(e.style.display == 'block') 
     e.style.display = 'none'; 
    else 
     e.style.display = 'block'; 
    } 
</script> 

<div id="formDiv"> 
<!-- Form div will be hidden after form submission --> 
<form id="myForm"> 

    Name: <input name="name" type="text" /><br/> 
    Email: <input name="email" type="text" /><br/> 
    Payee: <input name="payee" type="text" /><br/> 
    Cost of invoice/expense: <input name="cost" type="number" /><br/> 
    Reason: <textarea name="reason" style="margin: 2px; height: 148px; width: 354px;"></textarea><br/> 
    Upload file/image: <input name="myFile" type="file" /><br/> 
    <input type="button" value="Submit" 
     onclick="toggle_visibility('formDiv'); toggle_visibility('inProgress'); 
     google.script.run 
      .withSuccessHandler(updateOutput) 
      .processForm(this.parentNode)" /> 
</form> 
</div> 

<div id="inProgress" style="display: none;"> 
<!-- Progress starts hidden, but will be shown after form submission. --> 
Uploading. Please wait... 
</div> 

<div id="output"> 
    <!-- Blank div will be filled with "Thanks.html" after form submission. --> 
</div> 

そして、これは私が作成し、次のステップとして送信する電子メール機能ですが、私はいくつかを試してみました私が上にあるものとこれを適合させる方法を考え出すことはできません。

function sendEmails() { 
    //New vars 

    var bossEmail = "email address1"; 
    var accountsEmail = "email address2"; 
    var messageBoss = "<html><body>" 
    + "<p>" + "Hi Boss," 
    + "<p>" + name + " has submitted an invoice/expense that needs your approval since it is above £." + threshold 
    + "<p>" + "This is to pay £" + cost + "to" + reason 
    + "<p>" + reason 
    + "<p>" + "The invoice can be found attached to this email or here in our google drive:" + fileUrl 
    + "<p>" + "Please approve or reject the expense report here:" + approvalUrl 
    + "</body></html>"; 

    var messageAccounts = "<html><body>" 
    + "<p>" + "Hi XX," 
    + "<p>" + name + " has submitted an invoice/expense that needs to be paid." 
    + "<p>Amount" + "This is to pay £" + cost + "to" + payee 
    + "<p>Reason:" + reason 
    + "<p>" + "The invoice can be found attached to this email or here in our google drive:" + fileUrl 
    + '<p>Please approve or reject the expense report <a href="' + approvalUrl + '">here</a>.' 
    + "</body></html>"; 
    if (cost > threshold) 
    { 
    var recipient = bossEmail 
    var subject = name + "has submitted an invoice that needs your approval" 
    var emailText = messageBoss 
    } 
    else 
    { 
    var recipient = accountsEmail 
    var subject = name + "has submitted an invoice to be paid" 
    var emailText = messageAccounts; 
    } 

    MailApp.sendEmail(recipient,subject,emailText); 
} 

何か助けや助言をいただければ幸いです。

答えて

0

私はあなたのような、sendEmails()関数にいくつかのパラメータを追加することがあると思う:あなたはちょうど右の変数を使用してPROCESSFORM()関数の終了前に、それを呼び出し、その後

sendEmails(accountsEmail,name,cost,threshold,payee,reason,fileUrl) 

sendEmails(email,name,cost,threshold,payee,reason,fileUrl); 

はまた)あなたはsetValues(呼び出すときに、あなたの「承認」VARあなたPROCESSFORM()関数が表示されていないことに注意してください...私はちょうど「IF」文の前にそれを宣言することをお勧め

var approval; 
    if (cost > threshold) 
    { 
    approval = "YES" 
    } 
    else 
    { 
    approval = "NO" 
    } 
関連する問題