top of page
執筆者の写真NISHIO KEI

特許庁の特許APIをスプレッドシートで使う

更新日:2023年6月29日

1.はじめに

  • 仕事で、特許調査の調査結果をまとめて調査報告書を作成しています。

  • その報告書には、発見された公報とその諸情報(発明の名称とか公開番号とか)を入れています。こんな感じ↓公報番号にはリンクを添えて。




  • この作業は今まで人手でやってましたが、特許庁が昨年からAPIを提供してくれているので、それを利用してなんとかできないか、と検討しました。

  • 利用の手引きを見たところ、1の経過情報APIと、13の固定アドレス取得のAPIを呼び出せばできそうです。




2.ソースコードなど

  • 3パートです。

(1)認証

  • 特許庁に利用申請して情報をもらいます。以下***の部分は自分に合わせてください。


function getauth(){
auth_url = "https://****"
const authurl = encodeURI(auth_url)

//payload情報
const payload = {
  'grant_type':'password',
  'username':'***',
  'password':'***'
}

//header情報
const headers = {'Content-Type': 'application/x-www-form-urlencoded'};
 
//urlfetchappのオプション情報
const options = {
    "method" : "POST",
    "headers" : headers,     //header情報を追加
    "payload": payload,      //payload情報を追加
    "muteHttpExceptions" : true
}
 
//auth
const auth_res = UrlFetchApp.fetch(authurl, options);
auth_res_json = JSON.parse(auth_res.getContentText())
access_token = auth_res_json.access_token
return access_token
}


以下のAPI呼び出しの際に使います。ほんとは1回だけ呼び出せばいいはずですが、うまく作れなかったので毎回呼び出してます。


(2)API呼び出し

これは丁寧にレスポンスを見ながら。公報の種類(特開/特表/特許)の分岐や、番号が存在しない場合の処理でpythonの文法と混ざってしまいはまりました。appendじゃなくてpushだ、とか。

async function get_app_progress_api(appnum){
  const token = getauth()  
  authtoken = "Bearer " + token

  //header情報
  headers = {"Authorization": authtoken}
  appprogress_url = "***" + String(appnum);

  const options = {
    "method" : "GET",
    "headers" : headers,     //header情報を追加
    "muteHttpExceptions" : true
  }
  
  const app_progress_res = UrlFetchApp.fetch(appprogress_url, options);

  //jsonobjectで各項目取得する場合
  const res_json = JSON.parse(app_progress_res.getContentText())


  const tempappdate = res_json.result.data.filingDate;
  const appdate = String(tempappdate).slice(0,4) +"-"+ String(tempappdate).slice(4,6)+"-" + String(tempappdate).slice(6,8)

  //公報日  
  let pubdatelist = []
  const pubdate = res_json.result.data.publicationDate;
  const regdate = res_json.result.data.registrationDate;
  pubdatelist.push(String(pubdate).slice(0,4) +"-"+ String(pubdate).slice(4,6) +"-"+ String(pubdate).slice(6,8))
  if(regdate)[
    pubdatelist.push(String(regdate).slice(0,4) +"-"+ String(regdate).slice(4,6)+"-" + String(regdate).slice(6,8))
  ]

  //公報番号
  let pubnumlist = []
  const pubnum = res_json.result.data.ADPublicationNumber;
  const hpubnum = res_json.result.data.ADNationalPublicationNumber;
  const regnum = res_json.result.data.registrationNumber;
 
  
  if(pubnum){
    pubnumlist.push("特開" + pubnum.slice(0,4) + "-" + pubnum.slice(4,12))
  }
  if(hpubnum){
    pubnumlist.push("特表" + hpubnum.slice(0,4) + "-" + hpubnum.slice(4,12))

  }
  if(regnum){
    pubnumlist.push("特許" + regnum)
  }

 
  const seikyu = res_json.result.data.bibliographyInformation;
  const title = res_json.result.data.inventionTitle;
  let seikyu_flag = "-"
  let seikyu_date = "-"

  for (const elm of seikyu) {
    if(elm.numberType == "01"){
      for(const elm2 of elm.documentList){
        if(elm2.documentDescription=="出願審査請求書"){
          seikyu_flag = "審査請求有";
          seikyu_date = elm2.legalDate;
          break;
        }else{
          seikyu_flag = "審査請求無";
          seikyu_date = "";
        }
      }  
    }
      
  } 


  //出願人情報取得
  const appl_attn = res_json.result.data.applicantAttorney
  let appllist = []
  let upubdatelist = []
  
  let applnames = ""
  for(const elm of appl_attn){
    if(elm.applicantAttorneyClass=="1"){
      appllist.push(elm.name)
      
    }
    applnames = appllist.join(',');
  }

   return [pubnumlist.join(','), appdate, pubdatelist.join(","),applnames,title,seikyu_flag,seikyu_date]

}



function get_link(appnum){
  const token = getauth()  
  authtoken = "Bearer " + token
  //header情報
  headers = {"Authorization": authtoken}
  app_statue_url = "***" + String(appnum);

  const options = {
    "method" : "GET",
    "headers" : headers,     //header情報を追加
    "muteHttpExceptions" : true
  }
  
  const app_statue_res = UrlFetchApp.fetch(app_statue_url, options);  
  const res_json = JSON.parse(app_statue_res.getContentText())
  const link = res_json.result.data.URL;
  return link
}


(3)スプレッドシートに格納

  • ここは適当に作ればおKです。上記の取得関数はGoogle Spreadsheetならば実行すると列方向に各情報が展開されます。

  • 私は下記のように使ってます。C列とD2にデータを展開しておいて、B2セルは=HYPERLINK(D2,C2)、他の行はB3=C3など。





3.今後

  • 特許後のステータス情報を報告書に当て込む方法を検討です。

  • だいたい、出願係属中/出願取下/権利存続中/権利満了の4つの状態であるので、経過情報のAPIで取得した情報をもとに分岐させていけばなんとかなると思います。

  • 参照したい段落をピンポイントで取得するようなAPIもほしいか、作りたいです。


閲覧数:32回0件のコメント

最新記事

すべて表示

Comments


bottom of page