0

XBRLファイルをGoogleスプレッドシートにダウンロードする次のコードがあります

function XBRLexplore() {
var ss = SpreadsheetApp.openById("0Aiy1DTQRndx6dFZLVDJfRnptbmRFUTM2S2lnUlRfWWd");
var Sheet = ss.getSheetByName("Sheet1"); // Activate sheet
var target = "http://www.sec.gov/Archives/edgar/data/867773/000086777313000052/spwr-20130630.xml";
var pageTxt = UrlFetchApp.fetch(target).getContentText();
var xbrl = Xml.parse(pageTxt,true).getElement()
var test=xbrl.getElements();

var output=[];
for (var i=0;i<test.length;i++){
    var element=test[i]
    var f=[element.contextref,element.id,element.unitref,element.decimals,e=element.Text]
    output[i]=f;
}

Sheet.getRange(1,1,test.length,5).setValues(output);

}

これにより、約 1700 行 x 5 列が Google スプレッドシートにドロップされます。

ただし、オブジェクト「xbrl」のすべてのサブ要素を各要素の横に追加したいと思います。

例: 現在、行 1421 は次のデータです。

D2013Q2QTD Fact-456FCC569047499F03F61D8FBE559EC1 shares -3 133973000

私はそれを次のようにしたい: us-gaap WeightedAverageNumberOfDilutedSharesOutstanding D2013Q2QTD Fact-456FCC569047499F03F61D8FBE559EC1 shares -3 133973000

us-gaap名前空間を追加WeightedAverageNumberOfDilutedSharesOutstandingし、最初の 2 列に

要素ごとに何らかのgetParent()関数を使用して、ループ中に最初の2列に貼り付けることができればいいと思います。

getNamespace()ループ内で for each 要素を使用しようとしていますが、エラーが発生します

var ff=element.getNamespace()

4

1 に答える 1

1

必要なノードを決定する方法がよくわかりませんが、ノードを決定した後、必要な最初の 2 つの列に対して次の操作を実行できます。

  ...
  var target = "http://www.sec.gov/Archives/edgar/data/867773/000086777313000052/spwr-20130630.xml";
  var pageTxt = UrlFetchApp.fetch(target).getContentText();
  var xbrl = XmlService.parse(pageTxt);
  var element = xbrl.getRootElement().getChildren()[1420];
  Logger.log(element.getNamespace().getPrefix()); // us-gaap
  Logger.log(element.getName()); // WeightedAverageNumberOfDilutedSharesOutstanding
  ...

単純にXmlと呼ばれていた古いサービスとは対照的に、新しいサービスにはXmlServiceを使用してアクセスします。

アップデート

XmlService に関する私の経験はほとんどありません。ノードの検索にワイルドカードを使用できるかどうかはあまりわかりません。非常に基本的な例であり、おそらく非効率的です。

  ...
  var ns = 'us-gaap';
  var target = "http://www.sec.gov/Archives/edgar/data/867773/000086777313000052/spwr-20130630.xml";
  var pageTxt = UrlFetchApp.fetch(target).getContentText();
  var xbrl = XmlService.parse(pageTxt);
  var elements = xbrl.getRootElement().getChildren();
  var el, attr;
  for (var element = 0, len = elements.length; element < len; ++element) {
    el = elements[element];
    if (el.getNamespace().getPrefix() === ns) {
      /* YOUR CODE */
      Logger.log(ns);
      Logger.log(el.getName());
      attr = el.getAttribute('contextRef');
      if(attr) Logger.log(attr.getValue());
    }
  }
  ...
于 2013-08-04T21:59:35.957 に答える