0

Google ドキュメントのスプレッドシートから値 (名前、日付など) を読み取り、特定のフォームの説明 (テキスト コンテンツ) をカスタマイズして、それらの値でユーザーに送信するスクリプトを作成しようとしました。しかし、string.replace() メソッドが期待どおりに機能しません。キーを何も置き換えないだけです。何か不足していますか?私は答えなしで何時間もグーグルで過ごしました。どんな助けでも大歓迎です。

var docId = ScriptProperties.getProperty("QuestionnaireDocId"); 

var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;  // First row of data to process
var numRows = 1000000;   // Number of rows to process
// Fetch the range of cells A2:B3
var dataRange = sheet.getRange(startRow, 1, numRows, 5)
// Fetch values for each row in the Range.
var data = dataRange.getValues();

for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var name = row[0]; // this var isn't empty. - tested it to check

    var formSpreadsheet  = SpreadsheetApp.openById(docId);
    var sFormUrl = formSpreadsheet.getFormUrl();
    if(sFormUrl) {
        var response = UrlFetchApp.fetch(sFormUrl);
        var sFormContent = response.getContentText();

        //Replace <keyName> in the form description with the value of var 'name'
        sFormContent = sFormContent.replace("<keyName>", name); 


        //get only body content
        sFormContent = sFormContent.replace(/[\s\S]+<body[^>]*>([\s\S]+)<\/body>[\s\S]+/i, '$1');

        //remove script
        sFormContent = sFormContent.replace(/<script[^>]*>[\s\S]*<\/script>/i, '');
        //add inline style for form elements, since gmail does not allow style tag and      link tag to style it
        sFormContent = sFormContent.replace(/class\=\"errorbox-good\"/gi, 'class="errorbox-good" style="margin-bottom:1.5em;zoom:1"');
        sFormContent = sFormContent.replace(/class\=\"ss-q-title\"/gi, 'class="ss-q-title" style="display:block;font-weight:bold;"');
        sFormContent = sFormContent.replace(/class\=\"ss-q-help\"/gi, 'class="ss-q-help" style="display:block;color:#666;margin:.1em 0 .25em 0"');
        sFormContent = sFormContent.replace(/class\=\"ss-choices\"/gi, 'class="ss-choices" style="list-style:none;margin:.5em 0 0 0;padding:0;"');
    }
    var mailBody2;

    if(sFormUrl) {
        mailBody2 = '<br /><br />If you have trouble viewing or submitting this form, you can fill it out online:<br />';
        mailBody2 += '<a href="' + sFormUrl + '" title="">' + sFormUrl + '</a>';
        mailBody2 += '</body></html>';
        mailBody2 += '<br /><br />';
        mailBody2 += sFormContent;
        mailBody2 += '<br />';
    }       


    // Embed form and send the email - the emails work fine

    var subject = "Test email";

    MailApp.sendEmail(email_address, subject, mailBody2, {htmlBody: mailBody2}); 

}
4

1 に答える 1

1

これが書かれたとおりに機能しない原因となることがいくつか起こっているようです。まず、UrlFetchApp 呼び出しから取得したフォーム コンテンツには、フォームの説明が表示される場所が 2 つあります。ひとつはこんな感じ。フォームの説明フィールドに foo を入力するだけです。

<meta itemprop="description" content="foo &lt;keyName&gt;">

もう一方は次のようになります。

<div class="ss-form-desc ss-no-ignore-whitespace">foo </div>

2 番目のインスタンスは、実際にメールに表示されるもので、ご覧のとおり、既に取り除かれているようです。私の推測では、HTML のように見えるものはすべて削除されています。

だからここに私が試したものがあります。フォームの説明に、 の代わりに [keyName] を入れてください。

次に、[keyName] の最初のインスタンスだけでなく、グローバルに検索して置換し、両方の場所で取得できるようにする必要もあります。したがって、次の行を変更します。

sFormContent = sFormContent.replace("<keyName>", name); 

これに:

sFormContent = sFormContent.replace(/\[keyName\]/g, name);  

これらの変更を行うと、受信した電子メールの「foo」という単語の後に、スプレッドシートの値が説明に含まれていました。

于 2012-05-08T13:53:46.473 に答える