質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • JavaScript

    17474questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • API

    1600questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • REST

    148questions

    REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

[kintone] レコードの値を取得→計算→保存ボタン押下で表示を変えたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 543

ri_s48

score 3

 やりたいこと

kintoneでjavascriptを使った処理を作成しています
あるレコードのテーブルの内容を更新するときに
別のアプリから情報を取得し、値を更新するようにしたいです。

 処理概要

以下のような流れで処理を作成しています。

===

  1. レコード内のテーブルに値(①)を入れる

  2. <保存ボタン押下>

  3. 別アプリで①の情報を持つ別の値(②)を取得(kintone.api)

  4. ② を仕様に従って計算

  5. レコードの該当箇所に計算結果(③)代入

>> 保存後、③が該当箇所に表示されている

===

 状況

console.log()で確認したところ(下のソースの★)結果の代入は
出来ているように見えるのですが、保存完了後表示に変化がありません。

また、代入された値はブラウザを再読み込みして、もう一度保存処理をすると
ログ上では値が残っていますが(キャッシュ?)、
別のタブでHTTP Client ToolでGETしてみると③の値は消えています。

チュートリアルの「はじめようkintone API」第8回を参考に作成しました。
ここでは代入だけで更新できそうだったのですが、
レコードの更新APIを呼ぶ必要などありますでしょうか?

また、もしPUTが必要な場合bodyに変数は使えないのでしょうか?
(やってみたのですが入力エラーになってしまいました。)

何かお気づきの点があればご教授ください。

 コード

※ 抜粋

kintone.events.on(['app.record.create.submit','app.record.edit.submit','app.record.index.edit.submit'], function (event){

    var body= {
    "app":xxx,
    };


   // ② 必要な値を取得
    kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body
      ).then(function(resp) {   
          if (resp.records[0] !== null) {

              // レコード内のテーブルを一行ずつ呼び出す
            for(var j = 0; j < table_length; j++){

                var record_length = resp.records.length;

                // j行目のテーブルデータの情報を持つ値を別アプリのデータから探す
                for(var i = 0; i < record_length ; i++){

                    //該当データが見つかったら計算

                    //テーブルに値を代入
                    record_table.value[j].value.ayaya.value = ayaya_value;
                    record_table.value[j].value.hoyoyo.value = hoyoyo_value;
                    // ★cosole.log() ← ここで確認しました。

                }
            }
        }
        else{

        }
    }
    ).catch(function(){

    }
    );
    return event;
});

    

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sysjojo

    2018/07/17 20:28

    イベント3つ設定されていますがどのタイミングでも上手くいかないですか?app.record.index.edit.submit以外は上手くいってたりしないですか?あとは、フィールドのchangeイベントなど他のタイミングに変えてみたら上手くいきませんか?参考にされているページの「フィールドの値を書き換える」の項に該当している気がします。

    キャンセル

  • ri_s48

    2018/07/18 14:51

    コメントありがとうございます。 再度検討したところ、同期・非同期処理の問題でreturnを記載する箇所が誤っていました。(別途記載) コメントをいただいたようなイベントそれぞれの動作の切り分けはしていなかったので、コメントをいただけて気づけました。ありがとうございます。

    キャンセル

回答 1

check解決した方法

0

※ 自己解決しました

kintone.api は、非同期処理でした。
このためreturn event; の実行されるタイミングがkintone api終了前だったようです。

よって値の変更はreturnの後に起きていてログ上は処理が進んでいて
変わっているように見えますが、変数の値が変わっただけで
データ自体が更新されたわけではなかったようです。

Promiseを使うことで解決できました。

参考 kintone API で Promise を使ってみよう!

kintone.events.on(['app.record.create.submit', 'app.record.edit.submit', 'app.record.index.edit.submit'], function(event) {

var body = {
 "app": xxx,
 };

// ② 必要な値を取得
 return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body).then(function(resp) {
 if (resp.records[0] !== null) {

// レコード内のテーブルを一行ずつ呼び出す
 for (var j = 0; j < table_length; j++) {

var record_length = resp.records.length;

// j行目のテーブルデータの情報を持つ値を別アプリのデータから探す
 for (var i = 0; i < record_length; i++) {

//該当データが見つかったら計算

//テーブルに値を代入
 record_table.value[j].value.ayaya.value = ayaya_value;
 record_table.value[j].value.hoyoyo.value = hoyoyo_value;
 // ★cosole.log() ← ここで確認しました。

}
 }
 } else {

}
 return event;
 }).catch(function() {
 event.error = 'レコード取得エラー';
 return event;
 });
});

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaScript

    17474questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • API

    1600questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • REST

    148questions

    REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。