0

GoogleスプレッドシートとD3jsのD3-request/D3-request > headerをxhrリクエストで一緒に処理するのは難しいです。Googleスプレッドシートcsv/jsonファイルのD3-request検索が失敗します

XMLHttpRequest cannot load https://docs.google.com/spreadsheets/d/e/2PACX-1vSZyV9olwK_hx0BRFgLtTz5hs_Z…mROYhax3VD9AFXTvmcataf8LuSIpxGT2/pub?gid=1023695213&single=true&output=csv. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://fiddle.jshell.net' is therefore not allowed access. 

Jsfiddle here

それを回避するために、任意のアイデア:私は次のエラーを取得する

d3.request(url) 
    .header("X-Requested-With", "XMLHttpRequest") 
    .mimeType("text/csv") 
    .get(function(error, data) { 
     if (error) throw error; 
     console.log('request: '+ data); 
    }); 

は、私は次のJSを使うのか? tabletopを使用してjQueryの

$.get(url, function (result) { 
    var data = []; 
    $(result.feed.entry).each(function() { 
     data.push({"animal": this.gsx$animal.$t, "population": this.gsx$population.$t}); 
    }); 
    pie_chart(data, "#chart2"); 
}); 

使用D3のみ

d3.json(url, function (error, result) { 
    var data = []; 
    for (i = 0; i < result.feed.entry.length; i += 1) { 
     data.push({ 
      "animal": result.feed.entry[i].gsx$animal.$t, 
      "population": result.feed.entry[i].gsx$population.$t 
     }); 
    } 
    pie_chart(data, "#chart1"); 
}); 

を使用

+0

あなたのサンプルデータのための彼らの同意なしにユーザーからのメールを使用しないでください。 –

+0

Oups。これをすばやく中和できます! – Hugolpz

+0

@MaximilianPeters:大きな感謝。私はこのコードでとても忙しく、私は自分のシートに電子メールを載せていたことを忘れていました。 – Hugolpz

答えて

1

。以下は

Tabletop.init({ 
    key: key, 
    callback: function (data, tabletop) { 
     pie_chart(data, "#chart3"); 
    }, 
    simpleSheet: true 
}); 

のGoogleスプレッドシートからデータを取得し、D3 pie chartにそれを有効にするだけの簡単な例です。

//draws a pie chart with D3 
 
function pie_chart(data, id) { 
 
    var w = 400; 
 
    var h = 400; 
 
    var r = h/2; 
 
    var color = d3.scale.category20c(); 
 

 
    var vis = d3.select(id).append("svg:svg").data([data]).attr("width", w).attr("height", h).append("svg:g").attr("transform", "translate(" + r + "," + r + ")"); 
 
    var pie = d3.layout.pie().value(function (d) { 
 
     return d.population; 
 
    }); 
 
    var arc = d3.svg.arc().outerRadius(r); 
 

 
    var arcs = vis.selectAll("g.slice").data(pie).enter().append("svg:g").attr("class", "slice"); 
 
    arcs.append("svg:path") 
 
     .attr("fill", function (d, i) { 
 
      return color(i); 
 
     }) 
 
     .attr("d", function (d) { 
 
      return arc(d); 
 
     }); 
 

 
    arcs.append("svg:text").attr("transform", function (d) { 
 
     d.innerRadius = 0; 
 
     d.outerRadius = r; 
 
     return "translate(" + arc.centroid(d) + ")"; 
 
    }).attr("text-anchor", "middle").text(function (d, i) { 
 
     return data[i].animal; 
 
    }); 
 
} 
 

 
//the key of google spreadsheet 
 
var key = "1moczdbrfFwCp0L4Ube1a4GevuDcj2XQmCnpjArF_UEY"; 
 

 
//the url for jQuery and D3 
 
var url = "https://spreadsheets.google.com/feeds/list/" + key + "/od6/public/values?alt=json"; 
 

 
var i = 0; 
 

 
//D3 only 
 
d3.json(url, function (error, result) { 
 
    var data = []; 
 
    for (i = 0; i < result.feed.entry.length; i += 1) { 
 
     data.push({ 
 
      "animal": result.feed.entry[i].gsx$animal.$t, 
 
      "population": result.feed.entry[i].gsx$population.$t 
 
     }); 
 
    } 
 
    pie_chart(data, "#chart1"); 
 
}); 
 

 
//Jquery 
 
$.get(url, function (result) { 
 
    var data = []; 
 
    $(result.feed.entry).each(function() { 
 
     data.push({"animal": this.gsx$animal.$t, "population": this.gsx$population.$t}); 
 
    }); 
 
    pie_chart(data, "#chart2"); 
 
}); 
 

 
//tabletop 
 

 
Tabletop.init({ 
 
    key: key, 
 
    callback: function (data, tabletop) { 
 
     pie_chart(data, "#chart3"); 
 
    }, 
 
    simpleSheet: true 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/tabletop.js/1.4.3/tabletop.js"></script> 
 

 
<div id="chart1" style="width: 480px; height: 400px;"><span>D3 only</span></div> 
 
<hr> 
 
<div id="chart2" style="width: 480px; height: 400px;"><span>Jquery</span></div> 
 
<hr> 
 
<div id="chart3" style="width: 480px; height: 400px;"><span>Tabletop</span></div>


+0

Hello Max。私はもはやtabletopjsのファンではありません。私は実際に今日3時間を費やして最終的に[tabletopjのreadme.mdが古く、誤解を招く](https://github.com/jsoma/tabletop/issues/132)を見つけました。また、より多くのパワーと柔軟性をもって、より汎用性のあるものに手を差し伸べたいと思います。私はそれがどのように機能するかを知ることができれば、D3の要求は有望に見えます。しかし、tabletopjsコードのおかげで、それは他のbudieを助けるかもしれません:) – Hugolpz

+1

そのJQueryのおかげで、それはいくつかのユーザーに確かに役立つでしょう:) – Hugolpz

+0

あなたはマスターD3を意味するのですか?それは可能だとは思わない?私はd3要求ヘッダーを設定するだけで十分だと思っていたが、状況を理解できなかった可能性がある。 [D3-request>ヘッダー](https://github.com/d3/d3-request#request_header) – Hugolpz

関連する問題