kintoneからGASを外部APIで呼び出し、添付ファイルをGoogleDriveに保存したい。

お世話になっております。
表題の通り、kintone側からイベントでGASに書いたコードを実行させたいのですが、上手くいっておりません。
ご意見や解決方法等のご教示お願い致します。
またコードのどこが原因なのか不明のため、コードの全体を記載しておりますので、ご了承ください。

以下のサイトを参考にさせていただいています。
GASでkintoneの添付ファイルをGoogleDriveに保存する
kintoneアプリからGASでレコード情報を取得する方法(カーソルから取得する方法)

実現したいこと

前提:kintoneのプロセス管理において、次のステータスに移行したときに添付ファイルをGoogleDriveに自動で保存したい。

現状の想定:ステータス更新時、GASのコードを外部APIとして呼び出し、GAS側で添付ファイルの保存処理を行う。

理想:ステータス更新を行ったレコードのレコード番号など(クエリで一意に検索できるもの)をGASに渡す。その後、GAS側でその引数を使ってステータス更新されたレコードを特定し、そのレコードの添付ファイルをGoogleDriveに保存する。

発生した問題やエラーメッセージを具体的に書きましょう

・kintoneにステータス200が返ってくるにも関わらず、添付ファイルが保存されていない。
・GAS単体で実行したときには保存されている。
・kintoneからGASへの引数を渡せていない。

実行したコード

・kintone
第一段階として、引数を渡さずにGAS側でレコード番号を指定するテスト状態のコードです。

(function() {
  'use strict';
  kintone.events.on('app.record.detail.process.proceed', function(event) {
    
    var record = event['record'];
    var appId = kintone.app.getId();
    var recordId = kintone.app.record.getId();
    var nStatus = event.nextStatus.value;

    if (nStatus === "承認" ){
      console.log(record);
      var gasurl = '【GASのAPIのURL】';

      kintone.proxy(gasurl, 'GET', {}, {}, (body, status, headers) => {
        // success
        console.log('status:'+status);
      }, (error) => {
        // error
        console.log(error); // proxy APIのレスポンスボディ(文字列)を表示
      });
      return event;
    }
  });
})();

・GAS

function doGet() {

  var appId = 【アプリID】;
  var recordId = 【レコード番号】; // kintoneから渡したい

    // fileKeyとファイル名を取得する
    const url_get = 'https://【サブドメイン】.cybozu.com/k/v1/record.json?app='+appId+'&id='+recordId;
    const options = {
        headers : {
          'X-Cybozu-API-Token' : "【kintoneアプリのAPIトークン】",
        },
    };

    const resp_get = UrlFetchApp.fetch(url_get,options);
    const data = JSON.parse(resp_get);
    const fileKey = data.record.添付ファイル.value[0].fileKey;
    const fileName = data.record.添付ファイル.value[0].name;
    
    // ファイルをダウンロードする
    const url_file = 'https://【サブドメイン】.cybozu.com/k/v1/file.json?fileKey=' + fileKey;
    const resp_file = UrlFetchApp.fetch(url_file, options);
    const blob = resp_file.getBlob();
    // ファイル名をつけ直す
    blob.setName(fileName);

    // GoogleDriveの指定のフォルダに保存する
    const folder = DriveApp.getFolderById("【GoogleDriveのフォルダID】");
    folder.createFile(blob);

};

(1) kintone.proxyでGASにパラメータを送る

現在

kintone.proxy(gasurl, 'GET', {}, {}, (body, status, headers) => {

修正案

var data = { appId: appId, recordId: recordId };
kintone.proxy(gasurl, 'GET', {}, data, (body, status, headers) => {

(2) GAS側でパラメータを受け取る

https://developers.google.com/apps-script/guides/web?hl=ja の記載を参考に function doGet(e) { としてパラメータを受け取ります。

受け取った e の中身ですが、 doGet を外部から実行したときは単純に console.log(e) では確認できず面倒なので・・・

検証用にひとまず

function doGet(e) {
    var params = JSON.stringify(e);
    return ContentService.createTextOutput(params);
}

上記のようにしておいて、kintone側で

      kintone.proxy(gasurl, 'GET', {}, data, (body, status, headers) => {
        // success
        console.log('body:', body);
        console.log('status:'+status);

などとすれば確認しやすいかなと思います。

なお、

kintoneにステータス200が返ってくるにも関わらず、添付ファイルが保存されていない。

については、提示されているコードからはよくわかりませんでした。

「いいね!」 2

あ、kintone.proxy() は Promise なので await か then を書いてないからのような気がします。

kintone.events.on('app.record.detail.process.proceed', async function(event) {

に変更して

      await kintone.proxy(gasurl, 'GET', {}, {}, (body, status, headers) => {
        // success
        console.log('status:'+status);
      }, (error) => {
        // error
        console.log(error); // proxy APIのレスポンスボディ(文字列)を表示
      });

にするとどうですかね?

「いいね!」 1

横からすいませんがPromiseの書き方などについてはこちらがありますm(_ _)m

「いいね!」 2

お世話になっております。
トピックへの返信及びご意見、ありがとうございます。

いただいたご意見をもとに試行錯誤していたのですが、GAS側の処理をクエリで検索する方法に変更することにいたしました。
理由としては「kintone.proxyではGETでリクエストボディを送ることができない」との記載を見落としていたことに気付いたためです。
またクエリでの検索方法に切り替えた結果、

こちらについての問題については解決いたしました。理由は不明です。
しかし、ここで新たな問題が発生したため、またお力添えをお願いいたします。

実現したいこと

GASで外部APIを実行する前にレコード内容を更新し、更新した内容でクエリ検索を行いたい。

・理由
実行イベントがステータス更新時、かつGASへリクエストを渡せないため、どのレコードのステータスを更新したのかをクエリ検索で判別させるため。

発生した問題

エラー:レコードを再読み込みしてください。編集中に、ほかのユーザーがレコードを更新しました

実行したコード

・kintone

(function() {
  'use strict';
  kintone.events.on('app.record.detail.process.proceed', async function(event) {
    var record = event.record;
    var appId = kintone.app.getId();
    var recordId = kintone.app.record.getId();
    var nStatus = event.nextStatus.value;
  
    const body = {
      app: appId,
      id: recordId,
      record: {
        GAS判定: {
          value: '1'
        }
      }
    };

    if (nStatus === "承認"  ){
      await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', body);
      var gasurl = '【GASのAPIのURL】';

      kintone.proxy(gasurl, 'GET', {}, {}, (body, status, headers) => {
        // success
        console.log('status:'+status);
      }, (error) => {
        
        // error
        console.log(error); // proxy APIのレスポンスボディ(文字列)を表示
      });
      
      record['GAS判定'].value = ''
      return event;
    }
  });
})();

・GAS


const api_url = 'https://【サブドメイン】.cybozu.com';
const authorization = encodeBase64Text('【kintoneのログインID】:【パスワード】');

function doGet() {
  let app_id = 【アプリID】;//kintoneアプリID
  let data = {
    'app':app_id,
    'fields': ['レコード番号', 'タイトル', '添付ファイル'],
    'query':" GAS判定 = 1",
    'size': 500
  }
  let result = CreateCursor(data);//カーソルの作成
  let records_data = GetCursor(result.id);//カーソルからレコード情報の取得
  console.log(records_data.records);//consoleにレコード情報を表示

  const fileKey = records_data.records[0].添付ファイル.value[0].fileKey;
  const fileName = records_data.records[0].添付ファイル.value[0].name;

  // ファイルをダウンロードする
  const options = {
      headers : {
        'X-Cybozu-API-Token' : "【kintoneアプリのAPIトークン】",
      },
  };

  const url_file = 'https://2l1u5.cybozu.com/k/v1/file.json?fileKey=' + fileKey;
  const resp_file = UrlFetchApp.fetch(url_file, options);
  const blob = resp_file.getBlob();
  // ファイル名をつけ直す
  blob.setName(fileName);

  // GoogleDriveの指定のフォルダに保存する
  const folder = DriveApp.getFolderById("【GoogleDriveのフォルダID】");
  folder.createFile(blob);
}

//カーソルの作成
function CreateCursor(data)
{
  let headers = {
    'Content-Type':'application/json',
    'X-Cybozu-Authorization':authorization
  };
  let options = {
    'method' : 'post',
    "headers" : headers,
    'payload' : JSON.stringify(data)
  };
  let response = UrlFetchApp.fetch(api_url+'/k/v1/records/cursor.json', options);
  return JSON.parse(response);
}
//カーソルIDからレコード情報の取得
function GetCursor(id)
{ 
  let headers = {
    //'Content-Type':'application/json',
    'X-Cybozu-Authorization':authorization
  };
  let options = {
    'method' : 'get',
    "headers" : headers
  };
  let response = UrlFetchApp.fetch(api_url+'/k/v1/records/cursor.json?id='+id, options);
  return JSON.parse(response);
}

// Base64エンコード
function encodeBase64Text(text) {
  return Utilities.base64Encode(text, Utilities.Charset.UTF_8)
}

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。