12

ページを解析し、定義したフォームを介して結果を googledocs スプレッドシートに送信するブックマークレットを作成しようとしています。

スクリプトの関連ビットは次のとおりです。

var form = document.createElement("form");

form.action = "http://spreadsheets.google.com/formResponse?formkey=Fd0SHgwQ3YwSFd5UHZpM1QxMlNOdlE6MA&ifq";
form.method = "POST";
form.id="ss-form";
form.innerHTML = ["<input id='entry_0' name = 'entry.0.single' value = '" + orderDate + "'/>", "<input name = 'entry.2.single' value = '" + email + "'/>", "<input name = 'entry.3.single' value = '" + customerID + "'/>", ].join("");
form.submit();


alert(form.innerHTML);

// 戻り値:

ブックマークレットを介してフォームに何も保存されていません-ブックマークレットのコードでGoogleの応答をキャプチャする方法はありますか? (fwiw、jQueryify経由でjQueryを注入しました)

編集:

Firebug の Net パネルは、ブックマークレットによってトリガーされたアクティビティをまったく聞いてませ

送信しようとしているフォームは次の場所にあります。

http://spreadsheets.google.com/viewform?hl=ja&formkey=dFd0SHgwQ3YwSFd5UHZpM1QxMlNOdlE6MA

スクリプトの値をそのフォームに挿入してから、それを送信するにはどうすればよいですか? 解析中のページでトリガーされたブックマークレット内のスクリプトを介して。

4

7 に答える 7

8

すでに jquery を使用している場合は、ajax ($.ajax) 経由でフォームを送信してみてください。Google が応答を返したときに呼び出される成功関数を設定できます。

または、firebug を使用して、Google が送り返す応答を表示できるはずです。

具体的には、次のようなことを試すことができると考えていました。

$.ajax({
  url: "http://spreadsheets.google.com/formResponse",
  data: { formkey: "Fd0SHgwQ3YwSFd5UHZpM1QxMlNOdlE6MA&ifq", "entry.0.single": orderDate, "entry.2.single": email, "entry.3.single": customerID },
  type: "POST",
  dataType: "xml",
  success: function(data, textStatus, XMLHttpRequest) {
    console.log("success");
    console.log(data);
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
    console.log("error");
    console.log(textStatus);
  },
})
于 2010-01-24T19:57:03.530 に答える
5

私はちょうどそのようなものを作りました。これが私のプロセスの内訳です。

さまざまな Web ページからの引用のリストを保持し、各引用に情報を追加する必要があります。

私のブックマークレットは、Google フォームを動的に生成します(作成済みの実際の G​​oogle フォームのソースを表示しました)。現在の URL、ページ タイトル、現在選択されているテキストが自動的に入力されます。フォームが送信されます。

手動で情報を追加する必要があるため、少なくとも 1 つの必須フィールドを意図的に含めなかったため、Google フォームにエラー メッセージが表示されます (ただし、URL、タイトル、引用符は既に入力されています)。これで、必要な他のすべての情報を手動で追加して、フォームを送信できるようになりました。

ブックマークレットがすべての必須フィールドに入力すると、Google フォームの成功応答「Thanks! Your response has been recording.」を受け取るだけです。

jQueryを使用するブックマークレットを生成するために、次のサイトを使用しました: http://benalman.com/code/test/jquery-run-code-bookmarklet/ホームページより)

そのサイトを適切に使用できるようにするには、ワンライナーHTML をエスケープする必要があります (このエスケープ ツールを使用できます) 。

必要な手順は次のとおりです。

  1. Google フォーム / スプレッドシートを作成する
  2. フォームのソースを表示し、ブックマークレットで入力するフィールドをコピーします
  3. HTML をエスケープし、これを使用して情報を入力するスクリプトを記述します。このサイトはブックマークレットを作成します

だから私の場合:

1. URL を保持する 1 つのテキスト フィールド、ページのタイトルを保持する別のテキスト フィールド、引用 (選択したテキスト) を保持する段落テキストを含むフォームを作成しました。フォームには、手動で入力するその他の必須フィールドもいくつか含まれています。

2.次の html を用意しました。

    <form method="POST"
        action="https://spreadsheets.google.com/spreadsheet/formResponse?formkey=XYZXYZXYZXYZXYZXYZXYZ&ifq">
    <input type="text" name="entry.0.single" value="" id="entry_0" />
    <input type="text" name="entry.3.single" value="" id="entry_3" />
    <textarea name="entry.2.single" id="entry_2"></textarea>
    <input type="提出" name="提出" value="提出" />
    </フォーム>

(entry_0 - URL、entry_3 - ページ タイトル、entry_2 - 引用)

3. 1 行にまとめてエスケープした後。次のスクリプトを使用しました。

frm = $(unescape('%3Cform%20action%3D%22https%3A//spreadsheets.google.com/spreadsheet/formResponse%3Fformkey%3DXYZXYZXYZXYZXYZXYZXYZ%26amp%3Bifq%22%20method%3D%22POST%22%3E%0A%3Cinput%20type%3D%22text%22%20name%3D%22entry.0.single%22%20value%3D%22%22%20id%3D%22entry_0%22%20/%3E%0A%3Cinput%20type%3D%22text%22%20name%3D%22entry.3.single%22%20value%3D%22%22%20id%3D%22entry_3%22%20/%3E%0A%3Ctextarea%20name%3D%22entry.2.single%22%20id%3D%22entry_2%22%3E%3C/textarea%3E%0A%3Cinput%20type%3D%22submit%22%20name%3D%22submit%22%20value%3D%22submit%22%20/%3E%0A%3C/form%3E'));
$(frm).children('#entry_0').attr('value',location.href);
$(frm).children('#entry_3').attr('value',$('title')[0].innerHTML);
$(frm).children('#entry_2').html(window.getSelection().toString());
$(frm).children('input[type=submit]').click()

この方法はクロムでテスト済みです。幸運を!

于 2011-05-30T20:59:32.103 に答える
4

今後は、投稿先の URL の末尾に &ifq を付けてください。これにより、405 リターンに関する問題のほとんどが簡単に解決されることがわかりました。

于 2012-12-10T21:26:54.373 に答える
2

完全な答えはありませんが、Curlを使用して機能させることができました。

curl http://spreadsheets.google.com/formResponse?formkey=dFpVLTVFY2t5dWdoNTZpNERwWDRxX2c6MQ&ifq --data entry.0.single=eric --data entry.1.single=pugh

また、プロトタイプを使用してAjax経由で動作させることができますが、Safariでのみ動作します。

私もFirefoxで許可されていない同じ405メソッドを取得します。これが私のスクリプトです:

function vote_for_synonym(word1, word2){
word1 = encodeURIComponent(word1);
word2 = encodeURIComponent(word2);

$req = new Ajax.Request("http://spreadsheets.google.com/formResponse?formkey=dFpVLTVFY2t5dWdoNTZpNERwWDRxX2c6MQ", {
  method: 'post',
  contentType: 'application/x-www-form-urlencoded',
  onCreate: function(){
   Element.show('systemWorking');
  },
  onSuccess: function() {
    Element.show('thanks');
    Element.hide('systemWorking')
  },
  onFailure: function() {
    Element.show('error');
  }
});           

}

また、私のonFailureは呼び出されず、onSuccessだけが呼び出されます。

于 2010-05-04T21:32:10.273 に答える
2

今日の時点で、私は正しいとマークされた答えを得ることができませんでした。グーグルはいくつかのことを変えたと思います。

HTTP POST を実行することで動作させることができましたhttps://docs.google.com/forms/d/<form_id>/formResponse

entry.645136839=<somevalue>フォーム フィールドから大きな数値が取得される場所としてフォーム データを使用します。

于 2013-02-18T18:26:56.740 に答える
0

これに追加するヒントがいくつかあると思いましたが、それらは問題を解決しないことが判明しました。

  • 間違いなく入力「名前」を使用してください(IDではありません)
  • 他のパラメータの 1 つは 'ifq' です。これを 'formkey' にバンドルする方法がわかりません (文字列は単なる文字列ですよね?)
  • Google フォームを完全にモックするには、次のフィールドを追加します。pageNumber=0; backupCache=''; submit=提出する

同じ「405 メソッドは許可されていません」というエラーが表示されます...

于 2010-04-20T14:42:19.780 に答える