見出し画像

(追記:コード掲載しました。ご活用ください。)googleスプレッドシートで特許庁apiから情報取得できるよう、ChatGPTと会話して作ってみた。

1.背景


最近見た記事で、
特許庁は民間ニーズにこたえる形でサービス範囲の拡大を続け、
令和4年1月以降、WEB APIを利用した特許情報の提供を試行開始しているんだそうです。
※「令和元年度 特許情報提供サービスの現状と今後に関する調査報告書」
r01-report.pdf (jpo.go.jp) 
てことは、望む声が少なからずあるわけですよ。

<以下はGPT3時代の古い文法です。2023/3以降のGPT3.5では指定内容が変わってるのでChat某氏に聞いても答えてくれません。素直に誰かのコーディングをパクりましょう。>

今ではChatGPTの助けで利用者が自分の好きなように容易にプログラムを作れるようになっていますので、おそらく助けてくれるのでは。まずは体験してみましょう。完成するまでのやりとりとコードを載せておきます。お時間があればやってみてください。

2.やってみた!

APIを利用した特許情報の試行提供 | 経済産業省 特許庁 (jpo.go.jp)
手引きによれば、まずは特許庁さんに利用申し込みしてID,パスワードを交付してもらう必要があるとのことで、別途そこは手続きしときます。
(申し込むと二日くらいで届きます。)さあ、準備完了。
ChatGPTさんに聞いてみましょう。2021年までの学習と聞いています。特許庁apiは2022年1月サービス開始。うまくいきますかどうか。


ちょっと情報少なかったか。。
仕様書読んでくれるか聞いてみよう。

お、だいじょうぶかな

仕様書をみてもらう

再度、Google  Apps Scriptで情報取得してくれるようおねがい


よくなった?経過情報取得をお願いしてみよう!

ちょっと情報怪しい・・追加情報を教えてあげる。

手順に従ってアクセストークン取得が必要なことを教えてあげる。

また新しい用語が出てきました。

あ、そういうことね、ごめんね。
言葉の定義についてお互いの確認をとったあと、再度コード作成依頼、

ためしにやってみましょう。
スプレッドシートの「拡張機能」ー「Apps Script」に貼り付けて保存、
デバッグ。

Google Apps scriptはブレークポイントごとに変数の値が全部表示されるのでデバッグが簡単。

ChatGPT生成コード生成コードからの修正が必要だったポイントは以下。
①特許庁さんから貰ったID,パスワード設定箇所
②特許庁さんから貰ったアクセストークンURL
③情報取得URL
④欲しい結果情報を指定するURL
で、それだけ直してます。

引数に出願番号を指定すると発明の名称が出てきます。

まあ、ここまできたら、そこから、いろいろ、発展させられるわけですよ。
そういう機会があればいいなあ。

ひとまずの暫定完成版
https://docs.google.com/spreadsheets/d/1U6tmojeGmFGgiXdWPWQBBwZK7C_LrcBgYKfTrNT6keA/edit?usp=sharing

うん、なかなか気に入った。
なにがいいって、googleスプレッドシート、ドロップダウン(プルダウン)に関数を割り当てとくと、実行結果入れてくれるんですよ。つまり処理を選べる。ドライブへの物理ファイル取得はセキュリティ仕様上、セルから呼んだらエラーとなるのでボタン化。

3.感想・考察

・ChatGPT:
ChatGPTを使っての開発については最初は曖昧ですけど情報を与えてどんどん追い込んでゆくと真価を発揮しますね。ノーコード開発ってわけにはいかなそうですが、人間が常に監視、修正する前提で下地を作ってくれるならば、飛躍的にいろいろなことが可能性を開いてくれます。
ChatGPT無料版は2021年までの限定的データセット、有料版($20/月)はより高度な学習を行い、多くの内容を理解してくれるそうですから、使ってたらもっと早かったでしょうね。ものづくりや問題解決の機会が多い人は導入したらおそらくいいでしょうね。

API
APIについてたしかにこういうツール画面を介さないデータの社内利用が身近になると、社内で使ってみようかい、て気分になりますね。ベンダさんでも、Patentfieldさんが既にAPI連携サービスの提供を開始されたそうで、運用のほとんどをAPIでカバーできるみたい。企業さん、事務所さんによって知財活用への力の入りようは違うんでしょうが、複数のAPIを組み合わせてデータ連携したりするんでしょうね。もし、この流れが一時的でないものなら、他のさまざまな情報ベンダさんも参入なさるでしょうね。もっと活用方法拡がる気がする。おもしろい話になればいいな。ワクワクする気持ち、大事だワン。

「Patentfield」API連携サービスの提供を開始|Patentfield株式会社のプレスリリース (prtimes.jp) https://drive.google.com/file/d/1-yOS_qaNhtqhnlfo4OOwT0hZppuxP6Qw/view?usp=share_link

20220301追記;こうやって自分のツールに機能として組み込んでみると、もうそれは自分の一部となって離れがたい、ログインして使う調査ツールとは異なるレベルの愛着が出るんですね。API提供ってやつは、サービス業の商売道具として実に魅力ですね。これは勉強になるな、フムフム。
20220301追記2;AIの普及によって人間はバカになる。そんなことをいう人もいるし、バカになるケースもあるだろう。でも、それは物事の一部にすぎない。物を作り出す手段が提供されたことで、一歩先へ進むことができる。少なくとも自分は今まで出來なかったことができた。SNSのそこここで人々が声を掛け合い、知の交流と未来への前向きな創造活動が加速している、カンブリア大爆発の萌芽を実感する。

人生は短い。不遇を呪ってもしょうがない。自分のためひとのため、できることをするのだ。(Special Thanks Mr.Mori,  Mr.Kusuura, 他多くの皆様にインスパイアをいただきました。)

ジェネラティブAIというあらたな道具を手にした人たちにより、日々、集合知がレベルアップしています。閉じこもっていては乗り遅れますよ。

ふわふわしてますね。こんなんでいいのかな・・

追記:全コード掲載しますね。
試行錯誤でやってみてください、ご質問あれば当方まで

 // **ID,PASSWORD セッテイ******************************
function id(){
var id = 'xxxxxxxx'; //特許庁さんからいただいたID
return id;
}

function password(){
var password = 'yyyyyyyy'; //特許庁さんからいただいたPASSWORD
return password
}

function tokenurl(){
  var tokenurl = 'https://ip-data.jpo.go.jp/zzzzzzz'; //特許庁さんからいただいたアクセストークンURL
}

 // *************************************************
 //    セル出力関数群
 // *************************************************

 // *************************************************
 //    ぜんぶ
 // *************************************************

function all(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  // var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){
   var meishou = "発明の名称:\n" + wresult.result.data.inventionTitle.trim();
   var shutsugannin = "\n出願人:\n";
   for (let i = 0;i< wresult.result.data.applicantAttorney.length; i++){
    var shutsugannin = shutsugannin + 
        wresult.result.data.applicantAttorney[i].applicantAttorneyCd  +
        " " + wresult.result.data.applicantAttorney[i].name + "\n";
   }
   var shutsuganbango = "出願番号:\n" + wresult.result.data.applicationNumber + "\n";
   var shutsuganbi = "出願日:\n" + wresult.result.data.filingDate + "\n";
   var koukaibangou = "公開番号:\n" + wresult.result.data.ADPublicationNumber + "\n";
   var koukaibi = "公開日:\n" + wresult.result.data.publicationDate + "\n";
   var tourokubangou = "登録番号:\n" + wresult.result.data.registrationNumber + "\n";
   var tourokubi = "登録日:\n" + wresult.result.data.registrationDate + "\n";

   var manryoubi = "存続期間満了年月日:\n" + wresult.result.data.expireDate + "\n";
   var masshoushikibetsu = "抹消識別:\n" + wresult.result.data.erasureIdentifier + "\n";
   var masshoubi = "本権利抹消日:\n" + wresult.result.data.disappearanceDate + "\n";
   var yuusenken = "優先権親(願番、優先日):\n" 
   if(wresult.result.data.priorityRightInformation.length==0){
       var yuusenken = yuusenken + "\n";
   }
   for (let i = 0;i< wresult.result.data.priorityRightInformation.length; i++){
        var yuusenken = yuusenken + 
                 wresult.result.data.priorityRightInformation[i].parisPriorityApplicationNumber
         + " " + wresult.result.data.priorityRightInformation[i].parisPriorityDate 
         + " " + wresult.result.data.priorityRightInformation[i].parisPriorityCountryCd
         + " " + wresult.result.data.priorityRightInformation[i].nationalPriorityApplicationNumber
         + " " + wresult.result.data.priorityRightInformation[i].nationalPriorityDate + "\n";
   }

   var bunkatsu = "分割(出願、公開、登録):\n" 
   if(wresult.result.data.divisionalApplicationInformation.length==0){
       var bunkatsu = bunkatsu + "\n";
   }
   for (let i = 0;i< wresult.result.data.divisionalApplicationInformation.length; i++){
    var bunkatsu = bunkatsu + 
       wresult.result.data.divisionalApplicationInformation[i].applicationNumber
         + " " + wresult.result.data.divisionalApplicationInformation[i].ADPublicationNumber + " " + wresult.result.data.divisionalApplicationInformation[i].registrationNumber + "\n";
   }

   var chuukan = "中間記録(コード、名称、書類番号、セパレータ、ページ数、サイズ)\n" 
      if(wresult.result.data.bibliographyInformation.length==0){
       var chuukan = chuukan + "\n";
   }
   for (let i = 0;i< wresult.result.data.bibliographyInformation.length; i++){
        var chuukan = chuukan + 
         "番号" + wresult.result.data.bibliographyInformation[i].numberType + " " +
         wresult.result.data.bibliographyInformation[i].number + "\n";
        for (let j = 0;j< wresult.result.data.bibliographyInformation[i].documentList.length; j++){
        var chuukan = chuukan + 
        wresult.result.data.bibliographyInformation[i].documentList[j].legalDate 
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].documentCode
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].documentDescription
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].documentNumber
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].documentSeparator
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].numberOfPages
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].sizeOfDocument            
             + "\n";
        }
   }
  var result = meishou + shutsugannin + shutsuganbango + shutsuganbi + koukaibangou + koukaibi + tourokubangou + tourokubi + masshoushikibetsu + manryoubi+ masshoubi + yuusenken + bunkatsu + chuukan;

  }   
  return result;
}

 // *************************************************
 //    中間
 // *************************************************
function 中間記録(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){

   var wchuukan = "中間記録(コード、名称、書類番号、セパレータ、ページ数、サイズ):\n" 
   if(wresult.result.data.bibliographyInformation.length==0){
    var wchuukan = wchuukan + "\n";
   }
   for (let i = 0;i< wresult.result.data.bibliographyInformation.length; i++){
      var wchuukan = wchuukan + 
      "番号" + wresult.result.data.bibliographyInformation[i].numberType + " " +
        wresult.result.data.bibliographyInformation[i].number + "\n";
      for (let j = 0;j< wresult.result.data.bibliographyInformation[i].documentList.length; j++){
        var wchuukan = wchuukan + 
        wresult.result.data.bibliographyInformation[i].documentList[j].legalDate 
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].documentCode
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].documentDescription
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].documentNumber
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].documentSeparator
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].numberOfPages
          + " " + wresult.result.data.bibliographyInformation[i].documentList[j].sizeOfDocument            
             + "\n";
      }    
   }
   var result = wchuukan;
  }
  return result;
}

 // *************************************************
function 出願人(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json'
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){
   var wshutsugannin = "出願人:\n";
   for (let i = 0;i< wresult.result.data.applicantAttorney.length; i++){
    var wshutsugannin = wshutsugannin + 
        wresult.result.data.applicantAttorney[i].applicantAttorneyCd  +
        " " + wresult.result.data.applicantAttorney[i].name + "\n";
   }
var result = wshutsugannin;
  }   

  return result;

}

 // *************************************************

 // *************************************************
function 分割情報(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  // var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){

   var wbunkatsu = "分割(出願、公開、登録):\n" 
   if(wresult.result.data.divisionalApplicationInformation.length==0){
       var wbunkatsu = wbunkatsu + "\n";
   }
   for (let i = 0;i< wresult.result.data.divisionalApplicationInformation.length; i++){
    var wbunkatsu = wbunkatsu + 
       wresult.result.data.divisionalApplicationInformation[i].applicationNumber
         + " " + wresult.result.data.divisionalApplicationInformation[i].ADPublicationNumber + " " + wresult.result.data.divisionalApplicationInformation[i].registrationNumber + "\n";
   }

var result = wbunkatsu;
  }   
  return result;

}

 
 // *************************************************
function 発明の名称(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){
   var wmeishou = "発明の名称:\n" + wresult.result.data.inventionTitle.trim();
var result = wmeishou;
  }   
  return result;

}


 // *************************************************
function 出願日(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  var result = "";
  if(wresult.result.errorMessage == ""){
   var wshutsuganbi = "出願日:\n" + wresult.result.data.filingDate + "\n";
   var result = wshutsuganbi ;
  }   
  return result;

}



 // *************************************************
function 公開番号(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

 
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){
      var wkoukaibangou = "公開番号:\n"  + wresult.result.data.ADPublicationNumber +  "\n";
      var result = wkoukaibangou;
   }
  
  return result;

}

//************************************************
function 公開日(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  var result = "";
  if(wresult.result.errorMessage == ""){
   var wkoukaibi = "公開日:\n" + wresult.result.data.publicationDate + "\n";
   var result = wkoukaibi ;
  }   
  return result;
}


 // *************************************************
function 公開esp(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

 
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
   Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){
    if(wresult.result.data.ADPublicationNumber > ""){
     var url1 = "https://worldwide.espacenet.com/patent/search?q=pn%3DJP";
     var url2 = wresult.result.data.ADPublicationNumber;
     var linkText = url2;
     var link =  url1 +url2 ;
     var wkoukaiesp =  link ;
     var result = wkoukaiesp;
    }
  }
  return result;
}

 // *************************************************
function 公開gpat(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

 
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  var result = "";
  if(wresult.result.errorMessage == ""){
    if(wresult.result.data.ADPublicationNumber > ""){
     var url1 = "https://patents.google.com/patent/JP";
     var url2 = wresult.result.data.ADPublicationNumber;
     var linkText = url2;
     var link =  url1 +url2 ;
     var wkoukaigpat =  link ;
     var result = wkoukaigpat;
    }
  }
  return result;
}

 // *************************************************
function 公開psc(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

 
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
   Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){
    if(wresult.result.data.ADPublicationNumber > ""){
     var url1 = "https://patents.google.com/patent/JP";
     var url2 = wresult.result.data.ADPublicationNumber;
     var linkText = url2;
     var link =  url1 +url2 ;
     var wkoukaiesp =  link ;
     var result = wkoukaiesp;
    }
  }
  return result;
}


 // *************************************************
function 登録番号(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  var result = "";
  if(wresult.result.errorMessage == ""){
   var wtourokubangou = "登録番号:\n" + wresult.result.data.registrationNumber + "\n";
   var result = wtourokubangou;
  }
  return result;
}

 // *************************************************
function 登録日(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  var result = "";
  if(wresult.result.errorMessage == ""){
   var wtourokubi = "登録日:\n" + wresult.result.data.registrationDate + "\n";
   var result = wtourokubi;
  }   
  return result;

}

 // *************************************************
function 登録esp(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  //var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

 
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  var result = "";
  if(wresult.result.errorMessage == ""){
    if(wresult.result.data.registrationNumber > ""){
     var url1 = "https://worldwide.espacenet.com/patent/search?q=pn%3DJP";
     var url2 = wresult.result.data.registrationNumber;
     var linkText = url2;
     var link =  url1 +url2 ;
     var wtourokuesp =  link ;
     var result = wtourokuesp;
    }
  }
  return result;
}

function 登録gpat(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  // var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

 
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
 Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){
    if(wresult.result.data.registrationNumber > ""){
     var url1 = "https://patents.google.com/patent/JP";
     var url2 = wresult.result.data.registrationNumber;
     var linkText = url2;
     var link =  url1 +url2 ;
     var wtourokugpat =  link ;
     var result = wtourokugpat;
    }
  }
  return result;
}



function 登録psc(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  // var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://patentscope2.wipo.int/search/en/detail.jsf?docPN=JP';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

 
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
 Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){
    if(wresult.result.data.registrationNumber > ""){
     var url1 = "https://patents.google.com/patent/JP";
     var url2 = wresult.result.data.registrationNumber;
     var linkText = url2;
     var link =  url1 +url2 ;
     var wtourokugpat =  link ;
     var result = wtourokugpat;
    }
  }
  return result;
}



function 抹消識別(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  // var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };
  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){

   var wmasshoushikibetsu = "抹消識別:\n" + wresult.result.data.erasureIdentifier + "\n";
   var result = wmasshoushikibetsu;

  }   
  return result;
}

function 抹消日(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  // var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){

   var wmasshoubi = "本権利抹消日:\n" + wresult.result.data.disappearanceDate + "\n";
   var result = wmasshoubi;

  }   
  return result;
}


function 満了日(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
  // var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_progress/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){

   var wmanryoubi = "存続期間満了年月日:\n" + wresult.result.data.expireDate + "\n";
   var result = wmanryoubi;

  }   
  return result;
}

function 引用文献(applicationNumber) {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定
  
   var applicationNumber="2005300266"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/cite_doc_info/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'muteHttpExceptions' : true
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var wresult = JSON.parse(response.getContentText());
  Utilities.sleep(3000);
  var result = "";
  if(wresult.result.errorMessage == ""){

   var winyou = "引用文献(日付・型・番号):\n" 

   for (let i = 0;i< wresult.result.data.patentDoc.length; i++){
    var winyou = winyou + 
       wresult.result.data.patentDoc[i].draftDate
         + " " + wresult.result.data.patentDoc[i].citationType + " " + wresult.result.data.patentDoc[i].documentNumber + "\n";
   }

var result = winyou;
  }   
  return result;

}

 


function 発送書類() {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定

  const sheet = SpreadsheetApp.getActiveSheet(); 
  const applicationNumber = sheet.getRange(4,1).getValue();

  // var applicationNumber="2005300265"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_doc_cont_refusal_reason_decision/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
    'Authorization': 'Bearer ' + accessToken,
    'Content-Type': 'application/json',
    'muteHttpExceptions' : true,
    'method': 'GET',
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + 
       applicationNumberParam, options);
  var fileBlob = response.getBlob();
  Utilities.sleep(3000);
  var result = "";
  var fileName = applicationNumber + "_発送書類_" +
      Utilities.formatDate(new Date()
     , "JST", "yyyyMMdd_HHmmss") + ".zip";
 
  var fileContent = response.getContent();
  var folder = DriveApp.getRootFolder(); // ルートフォルダを取得
  var file = folder.createFile(fileBlob.setName(fileName));
  return file.getUrl();

  return result;
}

function 意見書補正書() {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定

  const sheet = SpreadsheetApp.getActiveSheet(); 
  const applicationNumber = sheet.getRange(4,1).getValue();

  // var applicationNumber="2005300265"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_doc_cont_opinion_amendment/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
    'Authorization': 'Bearer ' + accessToken,
    'Content-Type': 'application/json',
    'muteHttpExceptions' : true,
    'method': 'GET',
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var fileBlob = response.getBlob();
  Utilities.sleep(3000);
  var result = "";
  var fileName = applicationNumber + "_意見書補正書_" + Utilities.formatDate(new Date()
  , "JST", "yyyyMMdd_HHmmss") + ".zip";
 
  // var folder = DriveApp.getFolderById(folderId);
  //var file = folder.createFile(fileBlob).setName(filename);
  var fileContent = response.getContent();
  var folder = DriveApp.getRootFolder(); // ルートフォルダを取得
  var file = folder.createFile(fileBlob.setName(fileName));
  return file.getUrl();

  return result;
}


function 拒絶理由通知書() {
  var ID = id();
  var PASSWORD = password();
  // IDとパスワードを設定

  const sheet = SpreadsheetApp.getActiveSheet(); 
  const applicationNumber = sheet.getRange(4,1).getValue();

  //var applicationNumber="2005300265"

  // アクセストークンを取得するためのURLとパラメータを設定
  var tokenEndpoint = tokenurl();
  var tokenPayload = {
    'grant_type': 'password',
    'username': ID,
    'password': PASSWORD
  };
  var tokenOptions = {
    'method': 'post',
    'payload': tokenPayload
  };

  // アクセストークンを取得
  var tokenResponse = UrlFetchApp.fetch(tokenEndpoint, tokenOptions);
  var accessToken = JSON.parse(tokenResponse.getContentText())['access_token'];

  するためのURLとパラメータを設定*********************
  var apiUrl = 'https://ip-data.jpo.go.jp/api/patent/v1/app_doc_cont_refusal_reason/';
  var applicationNumberParam =  applicationNumber;
  var options = {
    'headers': {
    'Authorization': 'Bearer ' + accessToken,
    'Content-Type': 'application/json',
    'muteHttpExceptions' : true,
    'method': 'GET',
    }
  };

  
  var response = UrlFetchApp.fetch(apiUrl + applicationNumberParam, options);
  var fileBlob = response.getBlob();
  Utilities.sleep(3000);
  var result = "";
  var fileName = applicationNumber + "_拒絶理由通知書_" + Utilities.formatDate(new Date()
  , "JST", "yyyyMMdd_HHmmss") + ".zip";
 
  // var folder = DriveApp.getFolderById(folderId);
  //var file = folder.createFile(fileBlob).setName(filename);
  var fileContent = response.getContent();
  var folder = DriveApp.getRootFolder(); // ルートフォルダを取得
  var file = folder.createFile(fileBlob.setName(fileName));
  return file.getUrl();

  return result;
}




function onOpen(e) {
  var temp = Utilities.getUuid();
  e.source
    .createTextFinder("=")
    .matchFormulaText(true)
    .replaceAllWith(temp);
  e.source
    .createTextFinder(temp)
    .matchFormulaText(true)
    .replaceAllWith("=");
}

ぜひやってみてください。(特許庁さんAPIは、呼び出しにもっさり時間がかかるし、一分間に10回まで(業務利用の旨、申請すればリミッター解除できるとのこと)とか、いろいろ制限があって挙動が神経質です。実用性どれだけあるのでしょう。)

感想下さい。

※特許庁の最新情報にこだわらないならgoogle patent経由なら安定して複数
 案件の情報取得が可能です。↓こっちの方が絶対実用的と思うんですが。

発明ツールもぜひ。ChatGPTの創造性に感心します。

ご意見下さい。

この記事が気に入ったらサポートをしてみませんか?