4

バックグラウンド...

Google Apps Script を作成して、Google ドキュメントのコンテンツを HTML として取得し、その HTML を使用して Google サイトで Web ページを作成または更新しようとしています。これを行う方法は既に知っていますが、その結果、ほとんどすべての書式設定が削除された Web ページが作成されます。Google Doc の html を見たところ、インライン スタイルが使用されていないことがわかり、Google サイトにはインライン スタイルが必要であると思われます。

CSS をインライン スタイルに変換してから Google サイト ページを作成するために使用できる Google Apps Script を持っている人はいますか? また、同じ機能を提供する Google Apps Script 環境内で使用できるライブラリも同様に優れています。Google Apps Scripting 環境内 (つまり、[リソース] - [ライブラリの管理] メニューから) に追加できるライブラリである必要があります。ありがとう。

ところで...

2 つの方法で Google ドキュメントから html を取得しようとしました。どちらの方法でも、同じ CSS の非インライン スタイルが得られますが、これを使用して Google サイト ページを作成すると取り除かれます。

1) 次のリンクで Romain Vialard の DocsListExtened Google Script Library を使用しました...

https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/driveservice

2) 私は、hgabreu@gmail.com や他の人を含む数人によって提案されたコードを使用しました...

https://code.google.com/p/google-apps-script-issues/issues/detail?can=2&start=0&num=100&q=&colspec=Stars%20Opened%20ID%20Type%20Status%20Summary%20Component%20Owner&groupby= &sort=&id=585

注: 同じ問題が、gmail ユーザーに送信される HTML メール メッセージにも影響します。

4

1 に答える 1

4

この変換を行うオンライン ツールは多数あるため、Google Apps Script からそのうちの 1 つを利用できます。(たまにこれを行う必要がある場合は、これらのサービスのいずれかを使用してみませんか?)

次のサンプル スクリプトは、Does Google Apps Script has something like getElementById?getElementByVal()の関数に基づいています。.

inline() 関数

/**
 * Convert html containing <style> tags to instead have inline css.
 *
 * This example uses an online service from MailChimp Labs, but
 * the same principle could be used to leverage several other
 * online providers.
 *
 * @param  {Text}  htmlWstyle  A block of HTML text including
 *                             <style>..</style> tags.
 *
 * @returns {Text}             Same HTML, converted to inline css.
 */
function inline(htmlWstyle) {
  // Generate a POST request to inline css web tool.
  var payload =
  {
    "html" : htmlWstyle,
    "strip" : "checked"
  };

  // Because payload is a JavaScript object, it will be interpreted as
  // an HTML form. (We do not need to specify contentType; it will
  // automatically default to either 'application/x-www-form-urlencoded'
  // or 'multipart/form-data')

  var options =
  {
    "method" : "post",
    "payload" : payload,
    "muteHttpExceptions" : true
  };

  var url = "http://beaker.mailchimp.com/inline-css";
  var response = UrlFetchApp.fetch(url, options);

  // The html from this service is non-compliant, so we need
  // to massage it to satisfy the XmlService.
  var badlink = new RegExp('<link (.*?)[\/]*>',"igm");
  var badmeta = new RegExp('<meta (.*?)[\/]*>',"igm");
  var badinput = new RegExp('<input (.*?)[\/]*>',"igm");
  var xml = response.getContentText()
                    .replace(badlink,"<link $1></link>" )
                    .replace(badinput,"<input $1></input>" )
                    .replace(badmeta,"<meta $1></meta>" )
                    .replace(/<br>/g,"<br/>");

  // So far, so good! Next, extract converted text from page. <textarea name="text" ...>
  // Put the receieved xml response into XMLdocument format
  var doc = XmlService.parse(xml);

  var inlineHTML = getElementByVal( doc, 'textarea', 'name', 'text' );
  return (inlineHTML == null) ? null : inlineHTML.getValue();
}

説明

そこには黒魔術があるように見えるかもしれません。以前の回答では、古い Xml サービスを使用して Web ページの構造を調べ、必要なビットを見つける方法について説明しました。それはまだ良い読み物 (そして投票、ヒント、ヒント!) ですが、そのサービスはなくなり、新しいXmlServiceには同等の探索的サポートがありません。

まず、興味のある機能を実行する Web サービスを見つけ、 UrlFetch サービスを使用して、サービスにコードを貼り付ける人をシミュレートしました。理想的には、それ以上の作業をしなくても使用できる形式で、必要な結果だけを返すものを望んでいます。残念ながら、私たちが持っていたのは完全な Web ページであり、結果を得るにはそれを養殖する必要がありました。基本的な考え方: XmlService を使用してページを解析および調査し、必要な部分だけを抽出します。

選択された Css Inline サービスでは、Chrome の「Inspect Element」機能を使用して、タグ タイプ ( <textarea>) とそれを一意に識別する方法( ) を決定しましたname="text"。その知識を武器にgetElementByVal()、POST リクエストから返された HTML を掘り下げるために必要なものはすべて揃っていました。(または、必要なテキストを検索して抽出するために String メソッドを使用することもできます。)

しかし、すべてをまとめると、XmlService は結果ページの HTML の形式について不平を言い続けました。そのため、JavaScript の String および RegExp メソッドを使用して、不正な形式のタグのバランスを取ってからページを渡しました。

関数の使用法を示す簡単な例を次に示しますinline()。スタイル情報は、外部 css リンクとタグ付けされたスタイルの両方から吸収されることに注意してください。

function test_inline() {
  var myHtml =
    '<html>'
  +   '<head>'
  +     '<title>Example</title>'
  +     '<link rel="stylesheet" href="http://inlinestyler.torchboxapps.com/static/css/example.css" ></link>'
  +   '</head>'
  +   '<body>'
  +     '<style type="text/css">'
  +        'h1{'
  +             'color:yellow'
  +        '}'
  +     '</style>'
  +     '<h1>An example title</h1>'
  +     '<p>Paragraph 1</p>'
  +     '<p class="p2">Paragraph 2</p>'
  +   '</body>'
  + '</html>';

  var inlined = inline(myHtml);
  debugger;  // pause in debugger, have a look at "inlined"
}

結果

  <html>
    <head>
      <title>Example</title>
    </head>
    <body>
      <h1 style="color: yellow;">An example title</h1>
      <p style="margin: 0;padding: 0 0 10px 0;">Paragraph 1</p>
      <p class="p2" style="margin: 0;padding: 0 0 10px 0;">Paragraph 2</p>
    </body>
  </html>
于 2013-12-19T18:56:01.453 に答える