文字列の抽出
【必須】やりたい・やりたかったこと
※最終的なゴールが分かる事で、適切な回答をもらいやすくなります
※例 ■■な機能を実装中に以下のエラーメッセージが発生しました。
1つ目のapiで補助金の情報の一覧を取得し、2つ目のapiで詳細情報を取得します。しかしながら、詳細情報の構造にバラつきがあるため、場合分けする必要がある。【必須】起きている問題やエラーメッセージ ※できるだけ詳細に書いてください
エラーメッセージ
詳細が空欄になってしまう。
【必須】ご自身で試されたこと ※できるだけ詳細に書いてください
※例1. [ xx xxx ] とGoogleで検索したが全く答えに辿り付けなかった
※例2. https://** を参考に xxx してみた関連するソースコードやスクリーンショット
function hojokin() {
// ここは SpreadsheetApp.getActiveSpreadSheet() でも良いとは思います
const spreadSheet = SpreadsheetApp.openById("1JrGBMHRITdyHKfCnaC04LkMTCTeK2wl3HodGwrbaTeI");
const sheetName1 = "入力";
const sheetName2 = "出力";
const sheet1 = spreadSheet.getSheetByName(sheetName1);
const sheet2 = spreadSheet.getSheetByName(sheetName2);
// headerにはAPIのレスポンスフィールドの一覧を1行目に記入しておきます
const header = sheet2.getRange("A1:J1").getValues()[0];
// シート1の検索キーワード(C11セル)の値をキーとして利用
const key = encodeURI(sheet1.getRange(11,3).getValue());
const url =https://api.jgrants-portal.go.jp/exp/v1/public/subsidies?keyword=${key}&sort=created_date&order=DESC&acceptance=1
;
const json = JSON.parse(UrlFetchApp.fetch(url).getContentText());
const result = json["result"];
for(i=0; i<result.length; i++) {
let row = [];
for (j=0; j < header.length; j++) {
row.push(result[i][header[j]]);
}
sheet2.getRange(i+2,1, 1, header.length).setValues([row]);
// Logger.log(result);
// Logger.log(row);
}
// 再度ID列を調べ、値を取ってきてdetail列に貼り付ける
const idIndex = header.indexOf("id")+1;
const detailIndex = header.indexOf("detail")+1;
const lastRow = sheet2.getLastRow();
const idList = sheet2.getRange(idIndex+1, 1, lastRow, 1).getValues();
// そのリストごとに処理する
for(let i = 0; i < idList.length; i++) {
if (idList[i][0] === "") {
break;
}
// detail列を更新する
setDetail(sheet2, idList[i][0], sheet2.getRange(i+2, detailIndex),sheet2.getRange(i+2, detailIndex+7));
}
}
/**
* id で指定された説明内容を rangeで指定されたセルに書き込む
*
* @param {string} sheet
* @param {strng} id
* @param {Range} range
*/
function setDetail(sheet, id, range,range2) {
const baseurl = "https://api.jgrants-portal.go.jp/exp/v1/public/subsidies/id/";
// URLを呼び出した結果の中に埋まっている文字列を取り出します
console.log(baseurl + id);
let html = UrlFetchApp.fetch(baseurl + id).getContentText();
let json = JSON.parse(html);
let result = json["result"][0]["detail"];
let output_url = json["result"][0]["front_subsidy_detail_page_url"];
// XML形式に合わないタグを変換します(他にも混入する可能性はなくもないので随時対応が必要かもしれません)
result = result.replace(/
/g, "
");
// XMLとしてパースするためにrootタグを前後に付与します
const doc = XmlService.parse("" + result + "");
Logger.log(doc);
const p = getElementsByTagName(doc.getRootElement(), "p");
Logger.log("p");
Logger.log(p);
if(p.slice(0,1) != "■"){
let str = "";
if(p===""){
for (i = 2; i < 4; i++) {
str = str + p[i].getValue() + "\n";
}
}
str = str + "\n";
}
let str = "";
// 先頭のPタグの内容を2件取り出します。最初は「■目的・概要」などがが入るので
// このコードでは無視していますが、先頭のpが大事かもしれないので調整してください
if(p===""){
for (i = 1; i < 3; i++) {
str = str + p[i].getValue() + "\n";
}
}
str = str + "\n";
// 対象セルに値をセットします
range.setValue(str);
range2.setValue(output_url);
console.log(range.getA1Notation(), str);
}
/**
function setURL(sheet, id, range) {
const baseurl = "https://api.jgrants-portal.go.jp/exp/v1/public/subsidies/id/";
// URLを呼び出した結果の中に埋まっている文字列を取り出します
console.log(baseurl + id);
let html = UrlFetchApp.fetch(baseurl + id).getContentText();
let json = JSON.parse(html);
let output_url = json["result"][0]["front_subsidy_detail_page_url"];
// XML形式に合わないタグを変換します(他にも混入する可能性はなくもないので随時対応が必要かもしれません)
result = result.replace(/
/g, "
");
// XMLとしてパースするためにrootタグを前後に付与します
const doc = XmlService.parse("" + result + "");
const p = getElementsByTagName(doc.getRootElement(), "p");
Logger.log("p");
Logger.log(p);
let str = "";
// 先頭のPタグの内容を2件取り出します。最初は「■目的・概要」などがが入るので
// このコードでは無視していますが、先頭のpが大事かもしれないので調整してください
for (i = 1; i < 3; i++) {
str = str + p[i].getValue() + "\n";
}
// 対象セルに値をセットします
range.setValue(str);
console.log(range.getA1Notation(), str);
}
*/
/**
* @param {string} element 検索する要素を指定します
* @param {string} tagName タグを指定します
* @return {string} element 対象の要素を返します
*/
function getElementsByTagName(element, tagName) {
let data = [], descendants = element.getDescendants();
for(let i in descendants) {
let elem = descendants[i].asElement();
if ( elem != null && elem.getName() == tagName) data.push(elem);
}
return data;
}