本帖最後由 javacomhk 於 2022-5-23 22:18 編輯
Webscrape 完就可以將個 stock portfolio 輸入 Google spreadsheet 及計算盈利
(E5)在 Google Spreadsheet 新增 worksheet 叫 Portfolio 如下內容,其中 Column F 就是取自每天 Webscrape 的股票價格,其 F2 formula 是 =vlookup($A2,AASTOCKS!$A$1:$E$30,3)
(E6)新增一個 google doc 例如下圖 其中{{ variable }},就會在 mail merge 時被取替
(E7) 新增 function sendPortfolioEmail() 在 main.gs 內- function sendPortfolioEmail(){
- // fill in google doc ID
- var id = 'FILL IN DOC ID HERE' ;
- var forDriveScope = DriveApp.getStorageUsed(); //needed to get Drive Scope requested
- var url = "https://docs.google.com/feeds/download/documents/export/Export?id="+id+"&exportFormat=html";
- var param = {
- method : "get",
- headers : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
- muteHttpExceptions:true,
- };
- var html = UrlFetchApp.fetch(url,param).getContentText();
- var htmlout1 = html;
- // email send out with replaced fields
- var portfolioSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Portfolio");
- const result = portfolioSheet.getDataRange().getValues();
- const numRows = result.length
-
- var TODAYPL = 0;
- var TOTALPL = 0;
- for (var i = 1; i < numRows; i++) {
- htmlout1 = htmlout1.replace("{{R"+i+"C1}}",result[i][0].toString().substring(0,5));
- htmlout1 = htmlout1.replace("{{R"+i+"C2}}",result[i][1]);
- htmlout1 = htmlout1.replace("{{R"+i+"C3}}",Utilities.formatString( '%.2f',result[i][4]));
- htmlout1 = htmlout1.replace("{{R"+i+"C4}}",Utilities.formatString( '%.2f',result[i][5]));
- htmlout1 = htmlout1.replace("{{R"+i+"C5}}", result[i][6].toLocaleString('en-US', { style: 'currency', currency: 'USD' }));
- htmlout1 = htmlout1.replace("{{R"+i+"C6}}", result[i][7].toLocaleString('en-US', { style: 'currency', currency: 'USD' }));
- htmlout1 = htmlout1.replace("{{R"+i+"C7}}", result[i][8]);
- TODAYPL += parseFloat(result[i][6]);
- TOTALPL += parseFloat(result[i][7]);
- }
- console.log("TODAYPL "+ TODAYPL.toLocaleString('en-US', { style: 'currency', currency: 'USD' }))
- console.log("TOTALPL "+ TOTALPL.toLocaleString('en-US', { style: 'currency', currency: 'USD' }))
- var nameSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
- htmlout1 = htmlout1.replace("{{TODAYPL}}",TODAYPL.toLocaleString('en-US', { style: 'currency', currency: 'USD' }));
- htmlout1 = htmlout1.replace("{{TOTALPL}}", TOTALPL.toLocaleString('en-US', { style: 'currency', currency: 'USD' }));
- var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
- const users = userSheet.getDataRange().getValues();
-
- for (var i = 0; i < users.length; i++) {
- var firstname = users[i][0];
- var lastname = users[i][1];
- var email = users[i][3];
- var htmlout2 = htmlout1;
- htmlout2 = htmlout2.replace("{{title_1}}","Dear "+ firstname +" "+lastname);
- htmlout2 = htmlout2.replace("{{heading_1}}","Portfolio Summary");
- MailApp.sendEmail({
- to: email,
- subject: "Your portfolio Summary",
- htmlBody: htmlout2
- });
- console.log('email sent to '+ email + ' ' + firstname + ' !!')
- }
- }
複製代碼 (E8) 新增 trigger 令 function sendPortfolioEmail() 定時在收市後執行 send email. 成功後收到電郵如下:
|