XMLのスクレイピングをGASでしてます
XmlからXmlServiceを使用して取得してスプレッドシートに保存できるコードを書いています
取得したいXML
要素の取得に条件が違う二つを一緒に取得したいです。
実現したいこと
MainProvision→Chapter→Section→Articleの要素取得と
MainProvision→Chapter→Articleの要素取得を
一緒にしたいです。
取得したいXML sectionある時 <Chapter Num="2"> <ChapterTitle>第二章 一般構造</ChapterTitle> <Section Num="1"> <SectionTitle>第一節 採光に必要な開口部</SectionTitle> <Article Num="19"> <ArticleCaption>(学校、病院、児童福祉施設等の居室の採光)</ArticleCaption> <ArticleTitle>第十九条</ArticleTitle> <Paragraph Num="1"> <ParagraphNum/> <ParagraphSentence> <Sentence Num="1" WritingMode="vertical">法第二十八条第一項(法第八十七条第三項において準用する場合を含む。以下この条及び次条において同じ。)の政令で定める建築物は、児童福祉施設(幼保連携型認定こども園を除く。)、助産所、身体障害者社会参加支援施設(補装具製作施設及び視聴覚障害者情報提供施設を除く。)、保護施設(医療保護施設を除く。)、婦人保護施設、老人福祉施設、有料老人ホーム、母子保健施設、障害者支援施設、地域活動支援センター、福祉ホーム又は障害福祉サービス事業(生活介護、自立訓練、就労移行支援又は就労継続支援を行う事業に限る。)の用に供する施設(以下「児童福祉施設等」という。)とする。</Sentence> </ParagraphSentence> </Paragraph>
取得したいXML sectionない時 <Chapter Num="4"> <ChapterTitle>第四章 耐火構造、準耐火構造、防火構造、防火区画等</ChapterTitle> <Article Num="107"> <ArticleCaption>(耐火性能に関する技術的基準)</ArticleCaption> <ArticleTitle>第百七条</ArticleTitle> <Paragraph Num="1"> <ParagraphNum/> <ParagraphSentence> <Sentence Num="1" WritingMode="vertical">法第二条第七号の政令で定める技術的基準は、次に掲げるものとする。</Sentence> </ParagraphSentence> <Item Num="1"> <ItemTitle>一</ItemTitle> <ItemSentence> <Sentence Num="1" WritingMode="vertical">次の表に掲げる建築物の部分にあつては、当該部分に通常の火災による火熱がそれぞれ次の表に掲げる時間加えられた場合に、構造耐力上支障のある変形、溶融、破壊その他の損傷を生じないものであること。</Sentence> </ItemSentence>
条件を2つ指定してeachできるようにしたい
sectionでもeachが必要です。
子要素をifで部分的にはできましたがsectionは子要素の多い親要素で書き方がわかりません。
該当のソースコード
function re() { var sheet = SpreadsheetApp.openById("********").getSheetByName("****"); let url = 'https://elaws.e-gov.go.jp/api/1/lawdata/昭和二十五年政令第三百三十八号'; let xml = UrlFetchApp.fetch(url).getContentText(); let document = XmlService.parse(xml); let root = document.getRootElement(); var lastrow = sheet.getLastRow(); var recordrow = lastrow + 1; const applData = root.getChild("ApplData"); const lawFullText = applData.getChild("LawFullText"); const law = lawFullText.getChild("Law"); const lawBody = law.getChild("LawBody"); const mainProvision = lawBody.getChild("MainProvision"); const chapters = mainProvision.getChildren("Chapter"); chapters.forEach(function(chapter) { const articles = chapter.getChildren("Article"); ***ここにsectionのforEachを追加?ある時とない時の条件設定がわかりません*** articles.forEach(function(article){ const articleCaption = article.getChild("ArticleCaption"); const articleTitle = article.getChild("ArticleTitle"); const paragraphs = article.getChildren("Paragraph"); if (articleCaption != null){ sheet.getRange("A" + recordrow).setValue(articleCaption.getText()); } sheet.getRange("B" + recordrow).setValue(articleTitle.getText()); if (paragraphs != null){ paragraphs.forEach(function(paragraph){ const paragraphNum = paragraph.getChild("ParagraphNum"); const paragraphSentence = paragraph.getChild("ParagraphSentence"); sheet.getRange("C" + recordrow).setValue(paragraphNum.getValue()); sheet.getRange("F" + recordrow).setValue(paragraphSentence.getValue()); recordrow = recordrow + 1; const items = paragraph.getChildren("Item"); if (items !== null) { items.forEach(function (item) { const itemtitle = item.getChild("ItemTitle"); sheet.getRange("D" + recordrow).setValue(itemtitle.getText()); const itemSentence = item.getChild("ItemSentence"); sheet.getRange("F" + recordrow).setValue(itemSentence.getValue()); recordrow = recordrow + 1; const columns = itemSentence.getChildren("Column"); if (columns !== null) { columns.forEach(function (column) { sheet.getRange("F" + recordrow).setValue(column.getText()); }) } const subitem1s = item.getChildren("Subitem1"); if (subitem1s !== null) { subitem1s.forEach(function (subitem1) { const subitem1Title = subitem1.getChild("Subitem1Title"); sheet.getRange("D" + recordrow).setValue(subitem1Title.getText()); const subitem1Sentences = subitem1.getChildren("Subitem1Sentence"); subitem1Sentences.forEach(function (subitem1Sentence) { sheet.getRange("F" + recordrow).setValue(subitem1Sentence.getValue()); }); const subitem2s = subitem1.getChildren("Subitem2"); if (subitem2s !== null) { subitem2s.forEach(function (subitem2) { const subitem2Title = subitem2.getChild("Subitem2Title"); sheet.getRange("D" + recordrow).setValue(subitem2Title.getText()); const subitem2Sentences = subitem2.getChildren("Subitem2Sentence"); subitem2Sentences.forEach(function (subitem2Sentence) { sheet.getRange("F" + recordrow).setValue(subitem2Sentence.getValue()); }); const subitem3s = subitem2.getChildren("Subitem3"); if (subitem3s !== null) { subitem3s.forEach(function (subitem3) { const subitem3Title = subitem3.getChild("Subitem3Title"); sheet.getRange("D" + recordrow).setValue(subitem3Title.getText()); const subitem3Sentences = subitem3.getChildren("Subitem3Sentence"); subitem3Sentences.forEach(function (subitem3Sentence) { sheet.getRange("F" + recordrow).setValue(subitem3Sentence.getValue()); }); }) } }) } }) } }) } }) } }) }) }
試したこと
if (section != null){ }
これだったら書かないで取得できるのと同じでした。
試してみた追加コード
実行したら何も反応せず終わりました。
gas
1上記と同じ 2 3 const applData = root.getChild("ApplData"); 4 const lawFullText = applData.getChild("LawFullText"); 5 const law = lawFullText.getChild("Law"); 6 const lawBody = law.getChild("LawBody"); 7 const mainProvision = lawBody.getChild("MainProvision"); 8 9 const chapters = mainProvision.getChildren("Chapter"); 10chapters.forEach(function(chapter) { 11 12****追加した部分**** 13 var sections = chapter.getChild("Section"); 14 if (sections != null,sections = null){ 15sections.forEach(function(section) { 16 sheet.getRange("A" + recordrow).setValue(section.getText()); 17 var articles = [chapter.getChildren("Article"), section.getChildren("Article")] 18******** 19articles.forEach(function(article){ 20 const articleCaption = article.getChild("ArticleCaption"); 21 const articleTitle = article.getChild("ArticleTitle"); 22 const paragraphs = article.getChildren("Paragraph"); 23 if (articleCaption != null){ 24 sheet.getRange("A" + recordrow).setValue(articleCaption.getText()); 25 } 26 sheet.getRange("B" + recordrow).setValue(articleTitle.getText()); 27 28以下同じ
補足情報
長文コードですみません。どなたかご教授いただけないでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/12/22 08:51
2022/12/22 08:52