google スプレッドシートから、GASでkintone の情報をGETしたい

スプレッドシート上で、ドメイン、appID, APIキー, レコード番号を入力させ、ボタン押下でkintone の対象レコードからスプレッドシートに情報を取り込むような処理を作っています。

テスト環境では動くのですが、本番環境に移設すると何故か添付のエラーが出てしまいます。止まっているのは「varfolder = DriveApp.getFolderById(folderId)」のところです。

kintone 側の設定側の何かでgoogle 側からのアクセスを拒否している? のでは、と思うのですが、何かあるある的なアドバイスがあればいただきたいです。

 

 

function postedFromKitone() {

// ポップアップNoなら処理終了

if(Browser.msgBox(“kintoneから情報を取得する”,Browser.Buttons.YES_NO) == “no”) return

// 呼び出し元スプレッドシート

letspreadSheet = SpreadsheetApp.getActive()

letsheetConst = spreadSheet.getSheetByName(‘const’)

letsheetKomon = spreadSheet.getSheetByName(‘客情報’)

letdomain = sheetConst.getRange(“B10”).getValue()

// レコード取得用URL

varurlGetRecords = “https://” + domain + “/k/v1/records.json”

// アプリID

varappId = sheetConst.getRange(“B11”).getDisplayValue()

// アプリAPIトークン

varapiToken = sheetConst.getRange(“B12”).getValue()

// 対象レコードID

varrecordId = sheetKomon.getRange(“B26”).getDisplayValue()

letappLink = Utilities.formatString(“https://%s/k/%s/show#record=%s”, domain, appId, recordId)

letfields = Array.prototype.concat.apply([], sheetKomon.getRange(“B2:B11”).getDisplayValues())

// kintoneからデータを取得

varparamFields = “&fields=” + encodeURIComponent(fields.join(“,”));

varquery = “&$id=”+ recordId

varurl = urlGetRecords + “?app=” + appId + paramFields + query;

varres = JSON.parse(UrlFetchApp.fetch(url, {“method”: “get”,“headers”: {“X-Cybozu-API-Token”: apiToken}}));

varrec = res.records[0]

// 客情報整形

varoutput = [];

fields.forEach(field => {

letvalue = “”

if(rec[field].type == ‘USER_SELECT’){

if(rec[field].value.length){

value = rec[field].value[0].name

}

}else{

value = rec[field].value

}

output.push([value])

});

letfolderId = rec[“客フォルダリンク”].value.split(‘/’).slice(-1)[0].split(‘?’)[0]

letfileName = Utilities.formatString(“%s_%s年度_チェックリスト”, rec[“取引先名”].value, rec[“期首の日付”].value.split(‘-’)[0])

vartemplate = DriveApp.getFileById(spreadSheet.getId())

varfolder = DriveApp.getFolderById(folderId)

// 指定フォルダにファイルをコピー

letcopiedFile = template.makeCopy(fileName, folder)

letcopiedSheet = SpreadsheetApp.open(copiedFile)

letcopiedSheetKomon = copiedSheet.getSheetByName(‘客情報’)

// 客情報に転記

copiedSheetKomon.getRange(‘C2:C11’).setValues(output)

copiedSheetKomon.getRange(26, 3).setValue(appLink)

Browser.msgBox(“****”)

}

— 以下別の処理が続く

こんにちは。ひよこです。

kintone 側の設定としてありえるのは、セキュアアクセスや IP 制限の設定がされているのかもしれません。
ただ、その場合は↓の行でエラーになるのでは?と思います。

var res = JSON.parse(UrlFetchApp.fetch(url, {"method": "get","headers": {"X-Cybozu-API-Token": apiToken}}));

var folder = DriveApp.getFolderById(folderId); でエラーになるということは、folderId が存在しないフォルダーの ID になってるかもしれません。

res.records の内容を確認して、folderId に相当するプロパティに存在するフォルダー ID が取得できているかどうか、確認すると良さそうと思いました。

 

ひよこさん、早速ありがとうございます。

kintone 側の設定としてありえるのは、セキュアアクセスや IP 制限の設定がされているのかもしれません。

こちらの設定は行っていません。

 

folderId が存在しないフォルダーの ID になってるかもしれません。

こちらも、フォルダは存在しています。

 

色々パターンを試してみたのですが、やはり当社の本番環境kintone にアクセスできていないようです。

  • テスト用 保存先Drive & テスト用 kintone 環境:◯
  • 本番用 保存先Drive & テスト用 kintone 環境:◯
  • テスト用 保存先Drive & 本番用 kintone 環境::heavy_multiplication_x:
  • 本番用 保存先Drive & 本番用 kintone 環境::heavy_multiplication_x:

もう少し試してみます。

 

テスト環境はパートナー用の開発環境なので、何かできる、できない、があるのかも知れませんね。

ひよこ様のおっしゃるように、kintone本番環境でアクセス拒否されているとすると、以下の処理でエラーになると思います。

varres =JSON.parse(UrlFetchApp.fetch(url, {"method":"get","headers": {"X-Cybozu-API-Token": apiToken}}));

以下の処理でfolderIdに値が設定できていて、かつスプレッドシートB26セルで指定したレコードIDが正しいレコードを指しているとすると、
本番環境とテスト環境とで異なる部分は客フォルダリンクフィールドに設定されている値になるかと思います。

let folderId = rec["客フォルダリンク"].value.split('/').slice(-1)[0].split('?')[0]

客フォルダリンクフィールドの値は本番環境とテスト環境とで完全一致していますか。

ひよこさま、Ryojiさま

ありがとうございました。本件解決しました。以下の部分を records → record にして動きました。フォルダが取得できなかったのは、下記の理由でスプレッドシート上で指定したレコード以外のレコード番号を見に行ってしまっていました。

// レコード取得用URL
var urlGetRecords = "https://" + domain + "/k/v1/records.json"

 

// レコード取得用URL
var urlGetRecords = "https://" + domain + "/k/v1/record.json"