因為對於原先的需求有了其他解決方案,沒空之下也就不再繼續研究這個議題了,整理一下之前的紀錄,以備日後自己查考(但很可能實際最後不管用)。內容不完整而且可能有錯誤,我自己也不曉得在寫什麼,請無意間進入閱讀的人小心喔。
在 Google Apps Script 端:
1. 從 Google Drive 取得 File 物件。
2. 用 DriveApp.File.getAs(contentType) 把檔案轉成 blob 物件。
3. 用 Blob.getBytes() 把 blob 轉成位元陣列(byte[])。
4. 用 Utilities.base64Encode(data) 把 Byte[] 轉成 Base 64 編碼的字串。
5. 回傳給用戶端的瀏覽器。
在用戶端瀏覽器開啟的網頁,由 JavaScript 接收 blob 物件,再由使用者選定存檔位置。
這篇文章試圖把檔案製作成 blob,以當作 GAS 的 doGet() 函式的 return 值,回傳給使用者的瀏覽器:
Serve PDF file as blob in Google Apps Script - Stack Overflow
這篇則試圖把伺服器傳來的 blob 物件,還原成 PDF 格式並存檔:
internet explorer - Save base64 string as PDF at client side with JavaScript - Stack Overflow
這個則使用比較新的程式寫法,也簡潔得多,但只處理到用戶端瀏覽器接收並轉為 blob :
Creating a Blob from a base64 string in JavaScript - Stack Overflow
這篇用的技術比較舊,但過程解釋的比較清楚:
HTML5筆記–Object URL-黑暗執行緒
在 DriveApp.File.getAs(contentType) 的官方說明中有提到,對大多數的 blob 而言,將 contentType 指定為 'application/pdf' 是唯一合法的選項。但我還是想試試不同類型,MDN整理了一份常見 MIME type 清單,並提及所有非純文字的檔案都可以使用 application/octet-stream 這個 MIME 類型。
2019年7月18日 星期四
2018年12月25日 星期二
[jQuery] jQuery 物件 vs DOM 物件
粗略記一下我自己的理解:
jQuery 框架主要是一個 JavaScript 函式庫,裡面包含很多個函式。
其中一個很重要的基本函式 jQuery() -- 通常會簡寫為 $() -- 用途就是返回一個「jQuery 物件」。
概念上,把 DOM 物件用 jQuery() 包裝過後,吐出來就是個 jQuery 物件。使用傳統 JavaScript 的 DOM 選取方法,取出來的就是 DOM 物件(或者說是一個 DOM 元素?)。
只有 jQuery 物件才能使用 jQuery 的各種好用方法。相反的,若要呼叫 DOM 方法則一定要是 DOM 物件才可以,jQuery 物件是不行的。
所謂jQuery 物件,本質上就是個陣列(Array),或者精確的說是個關聯式陣列物件(又稱物件實字Object Literal)。
餵給 $() 吃的參數值,可以有很多種格式,其中最常見的就是選擇器(一個符合jQuery selector規格的字串)。另外也可以吃 DOM 物件,用 jQuery() 把 DOM 物件包裝起來,就是個 jQuery 物件了:
反過來,若把 jQuery 物件取出陣列第一個屬性,就可以轉換成 DOM 物件:
參考資料:
DOM物件和JQuery物件的區別 - 掃文資訊
https://tw.saowen.com/a/0045b51128f3e570adc319b1d541d2545373c3f2a96864f9be24d7485ac67bfb
jQuery 框架主要是一個 JavaScript 函式庫,裡面包含很多個函式。
其中一個很重要的基本函式 jQuery() -- 通常會簡寫為 $() -- 用途就是返回一個「jQuery 物件」。
概念上,把 DOM 物件用 jQuery() 包裝過後,吐出來就是個 jQuery 物件。使用傳統 JavaScript 的 DOM 選取方法,取出來的就是 DOM 物件(或者說是一個 DOM 元素?)。
只有 jQuery 物件才能使用 jQuery 的各種好用方法。相反的,若要呼叫 DOM 方法則一定要是 DOM 物件才可以,jQuery 物件是不行的。
所謂jQuery 物件,本質上就是個陣列(Array),或者精確的說是個關聯式陣列物件(又稱物件實字Object Literal)。
餵給 $() 吃的參數值,可以有很多種格式,其中最常見的就是選擇器(一個符合jQuery selector規格的字串)。另外也可以吃 DOM 物件,用 jQuery() 把 DOM 物件包裝起來,就是個 jQuery 物件了:
var cr=document.getElementById("cr"); //dom物件
var $cr = $(cr); //轉換成jQuery物件
反過來,若把 jQuery 物件取出陣列第一個屬性,就可以轉換成 DOM 物件:
var $cr=$("#cr"); //jQuery物件
var cr = $cr[0]; //dom物件 也可寫成 var cr=$cr.get(0);
參考資料:
DOM物件和JQuery物件的區別 - 掃文資訊
https://tw.saowen.com/a/0045b51128f3e570adc319b1d541d2545373c3f2a96864f9be24d7485ac67bfb
2018年12月13日 星期四
[ES6] 點點點(...)——展開運算子(Spread Operator)vs 其餘運算子(Rest Operator)
點點點(...)作為一元運算子,位置在運算元之前。有兩種用法:
假設有一個函式只能吃參數,例如Math.max(),返回所有參數中的最大值:
直接餵陣列,它不吃:
在陣列前面加上展開運算子就可以了:
假設有一個函式預設只能吃陣列。例如輸入陣列,計算其項目個數:
若餵一堆參數它是不吃的:
但若幫函式的參數加上其餘運算子,就可以囉:
參考:
JavaScript ES6 中的展開運算子(spread operator)和其餘運算子(rest operator) ~ PJCHENder 那些沒告訴你的小細節
1. 展開運算子(Spread Operator):把陣列展開成參數
在陣列前面加上...,即可把每個陣列元素逐一展開,直接餵給函式當作若干個參數輸入。假設有一個函式只能吃參數,例如Math.max(),返回所有參數中的最大值:
Math.max(9, 3, 7, 13, 5); //13
直接餵陣列,它不吃:
Math.max([9, 3, 7, 13, 5]); //NaN
在陣列前面加上展開運算子就可以了:
Math.max(...[9, 3, 7, 13, 5]); //13
2. 其餘運算子(Rest Operator):把參數合併成陣列
跟展開運算子剛好相反。在陣列前面加上...,即可把所有參數合併成一個陣列,再餵給只吃陣列的函式當作輸入值。效果有點類似一般函式物件的arguments屬性(以類陣列型態存放所有輸入的參數)。假設有一個函式預設只能吃陣列。例如輸入陣列,計算其項目個數:
let count = arr => arr.length; console.log(count([6, 9, 37, 17, 64])); //5
若餵一堆參數它是不吃的:
console.log(count(6, 9, 37, 17, 64)); //undefined
但若幫函式的參數加上其餘運算子,就可以囉:
let count = (...arr) => arr.length; console.log(count(6, 9, 37, 17, 64)); //5
參考:
JavaScript ES6 中的展開運算子(spread operator)和其餘運算子(rest operator) ~ PJCHENder 那些沒告訴你的小細節
2018年12月10日 星期一
如何在Blogger文章內嵌入程式碼區塊?
1. 前言
方法主要是參考這篇介紹: [Blogger] 如何在 Blogger 顯示程式碼 - Google Code Prettify ~ m@rcus 學習筆記,貪圖它方便。安裝方法就省略了。
其實直接看原始專案說明也很清楚: GitHub - google/code-prettify: Automatically exported from code.google.com/p/google-code-prettify
本站目前就先採用這個方法來把程式碼嵌入到文章裡。
2. 使用方法
操作方法很簡單,就是在後台編輯HTML,直接把程式碼區塊插入為具有 class="prettyprint" 屬性的 pre 或 code 元素即可:
<pre class="prettyprint lang-html">
The lang-* class specifies the language file extensions.
File extensions supported by default include:
"bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html", "java",
"js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh", "xhtml", "xml",
"xsl".
</pre>
如上,若覺得有需要,可以加入 lang-XXXX 來指定程式語言。但其實 Google Code Prettify 會自動猜測。當然更可以依照嚴謹的 HTML 5 規格,用pre把code包起來,然後在code標籤內指定語言種類:
<pre class="prettyprint"><code class="language-java">...</code></pre>
3. 預先HTML轉碼
但是!某些程式碼可能要先經過HTML Encoding才能正常顯示。線上轉換:
HTML編碼 - 在線HTML編碼器 或者 HTML Encoder :: OpinionatedGeek
4. 其他備用方案
不過為了怕這個 Google Code Prettify 專案中止或與Blogger無法完全相容,還是打算找一些備案,先列在這裡備忘:
備案1: A.D.的程式筆記: 『其他』如何在Blogger文章顯示程式碼
備案2(還真的有點麻煩): [技術分享] 寫給會在部落格中撰寫程式碼的你 ─ 在網頁中嵌入高亮程式碼上色 (syntax highlighting) ~ PJCHENder 那些沒告訴你的小細節
訂閱:
文章 (Atom)
MJML完整語法說明
MJML 是一套由電子報服務商MailJet貢獻出來的開源框架,能用簡單的語法輕鬆撰寫響應式(RWD)的電子郵件內容,再透過免費開源的 轉檔程式 或 線上編輯器 ,產生最終的標準HTML程式碼。 上一篇 稍微針對其版面布局結構做了一點簡介,這篇就完整照著官網技術文件的內容(2...
-
MJML 是一套由電子報服務商MailJet貢獻出來的開源框架,能用簡單的語法輕鬆撰寫響應式(RWD)的電子郵件內容,再透過免費開源的 轉檔程式 或 線上編輯器 ,產生最終的標準HTML程式碼。 上一篇 稍微針對其版面布局結構做了一點簡介,這篇就完整照著官網技術文件的內容(2...
-
MJML 郵件設計語言框架 本文來源: MJML Documents (我動手翻譯了語法部分,請參考 這篇 ,結果差不多等於把文件全部翻完了XD) MJML是一種用來編寫響應式電子郵件程式碼的標記語言(markup language),由開源的轉譯引擎來把撰寫好的程式碼...
-
1. 前言 方法主要是參考這篇介紹: [Blogger] 如何在 Blogger 顯示程式碼 - Google Code Prettify ~ m@rcus 學習筆記,貪圖它方便。安裝方法就省略了。 其實直接看原始專案說明也很清楚: GitHub - google/c...