JavaScriptを使って 添付ファイルにファイルコード内で添付をするというコードを作りたいです。

(function() {
  ‘use strict’;
  
  kintone.events.on(‘app.record.detail.show’, function(event) {

  //Function to create and attach a text file
  function attachTextFileToKintone() {
  var appId = kintone.app.getId(); // Replace with your Kintone App ID
  var recordId = kintone.app.record.getId(); // Replace with the record ID to attach the file
  var fileFieldCode = ‘TOTFILE’; // Replace with your Kintone File Field Code
  var apiToken = ’ — ';
  var text = “This is a sample text file.”;
  var fileName = “sample.txt”;
  var blob = new Blob([text], { type: ‘text/plain’ });

  var formData = new FormData();
  formData.append(fileFieldCode, blob, fileName);
  
  var xhr = new XMLHttpRequest();
  xhr.open(‘POST’, ‘https:// —  .cybozu.com/k/v1/record/attachment.json’, true);

  xhr.setRequestHeader(‘X-Requested-With’, ‘XMLHttpRequest’);
  xhr.setRequestHeader(‘Authorization’, ‘Bearer’ + apiToken);  //Uncomment this line if authentication is required

  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        alert(‘Text file attached successfully!’);
        console.log(xhr.responseText);
      } else {
        alert('Error attaching text file: ’ + xhr.status);
        console.error(xhr.responseText);
      }
    }
  };
  xhr.send(formData);
}
// Create a button
var button = document.createElement(‘button’);
button.innerHTML = ‘Attach Text File’;
button.addEventListener(‘click’, attachTextFileToKintone);
// Append the button to the page
document.body.appendChild(button);
  });
})();

XMLHttpRequest でフォームで作って作成したり、
KintoneでAPIを利用して作ったりしても 上手く行かないです。

詳細設定は以下の通りです。
JavaScriptプラグインしか入れてません、
最初はどいうファイルでも構いません、

ファイルをアップロードして添付ファイルと結び付けるには

ファイルをアップロードするREST APIを実行

②成功時にアップロードしたファイルのアップロード用ファイルキーが返ってくるので、1件のレコードを更新するREST APIのリクエストボディにファイルキーを含めて実行

といった手順で可能です(もし、既にレコード内にある添付ファイルを別のレコードに添付するような動作をする場合は、レコード内のダウンロード用ファイルキーを使ってダウンロード→ダウンロードしたファイルをアップロード→アップロード用ファイルキーを使って1件のレコードを更新という手順になります)。

1 Like

REST APIを使用しても保存されなかったです、、

ファイルがダウンロードされているのは確認済みです。
後は保存するだけなのですが何故か上手く行かないです。 (エラーは無し)

(function() {
  'use strict';

  

  kintone.events.on('app.record.detail.show', (event) => {
    

    const fileContent = 'テストファイルです';

      const blob = new Blob([fileContent], {
          type: 'text/plain'
        });
    

    const fileName = 'test.txt';
    const fieldType = 'TOTFILE';
    const recordId = kintone.app.record.getId();
    const appId = kintone.app.getId();
    const requestToken = kintone.getRequestToken();

    const formData = new FormData();
    formData.append(' __REQUEST_TOKEN__', requestToken);
    formData.append('app', appId);
    formData.append('record', recordId);
    formData.append('field', fieldType);
    formData.append('file', blob, fileName);

    saveAs(blob, fileName);//
      
  const endpointUrl = 'https:// *********.cybozu.com/k/v1/file.json';
    const headers = {
      'X-Requested-With': 'XMLHttpRequest',
    'X-Cybozu-API-Token': ' ****************************',
      };

    fetch(endpointUrl, {
      method: 'POST',
      headers,
      body: formData,
    })
      .then((resp) => resp.json())
      .then((respData) => {
        console.log("form の中身" + respData);    
        const json = {
          app: kintone.app.getId(),
          id: kintone.app.record.getId(),
          record: {
            file: {
              value: [{fileKey: respData.fileKey}]
            }
          }
        };
          
        kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', json);
        console.log(json);
        console.log("im called tho");
        
      })
      .catch((error) => {
        console.error(error);
      });
  });
  
})();

送ってるモノは違うのでしょうか?

横からすみませんが

URLやAPIキーが丸見えなのでマスクしたほうがよいかと・・・。

kintone-rest-api-clientを使ってみるのはいかがでしょうか?。
https://github.com/kintone/js-sdk
https://github.com/kintone/js-sdk/blob/master/packages/rest-api-client/docs/file.md

ご参考までに。

mtec さま

          const json = {
            app: kintone.app.getId(),
            id: kintone.app.record.getId(),
            record: {
              file: {
                value: [{fileKey: respData.fileKey}]
              }

この部分ですが、最初に投稿された画像を見ると、フィールドコードがTOTFILEとなっていますが、それであれば

          const json = {
            app: kintone.app.getId(),
            id: kintone.app.record.getId(),
            record: {
            TOTFILE: {
                value: [{fileKey: respData.fileKey}]
              }

こうなるはずです。

 

画像のフィールドコードに気付かずにfileというフィールドコードで動かしてみて、エンドポイントとAPIトークンのみ変更で弊社環境は成功した(FileSaverは使っていないのでsaveAsの行は削除しました)ので、コードは問題ないと思います。

あとは先に投稿されたらいとさまに同じく、投稿内容の修正をおすすめします。

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