【自己解決】サブテーブルの日時によるソート方法

https://developer.cybozu.io/hc/ja/community/posts/201208020-%E3%82%B5%E3%83%96%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E3%82%BD%E3%83%BC%E3%83%88

 

サブテーブル内のソートについて質問です。

上記の回答を元に日付によるソートは成功したのですが、

同時に時間でのソートも掛けたいです。

どのようにコードを修正すればよいでしょうか?

 

例)3/27 9:00 登校

3/25 8:00 起床

3/25 8:30 朝食 ←これを上に表示したい。

Naeko様

お世話になっております。
cstapの江田と申します。

https://qiita.com/PianoScoreJP/items/f0ff7345229871039672#%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97%E3%81%AE%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%AD%E3%83%BC%E3%81%A7%E3%82%BD%E3%83%BC%E3%83%88
こちらの記事のように、sort()のコールバック関数のreturnの条件を追加すれば、複数のフィールドでソートできます。

varsortTable=function(table,orderBys,isDesc){table.sort(function(a,b){for(orderByoforderBys){varfieldType=a.value[orderBy].type;varv1=a.value[orderBy].value;varv2=b.value[orderBy].value;// 数値と日時は変換してから比較switch(fieldType){case'RECORD\_NUMBER':case'NUMBER':varv1=parseFloat(v1);varv2=parseFloat(v2);break;case'DATE':case'TIME':case'DATETIME':case'CREATED\_TIME':case'UPDATED\_TIME':varv1=(newDate(v1)).getTime();varv2=(newDate(v2)).getTime();break;};varpos=isDesc?-1:1;if(v1\>v2){returnpos;}if(v1\<v2){returnpos\*-1;}}});};// 登録、編集時の処理kintone.events.on(["app.record.edit.submit","app.record.create.submit"],function(event){vartable=event.record.subtable.value;sortTable(table,['日付','時間'],true);returnevent;});

江田篤史 様

 

GWを挟み、業務が溜まっていたためお礼が遅くなりました。

申し訳ありません!

 

同様の理由からまだご教授頂いた内容で試すことができていませんが、

手が空き次第、是非試させて頂きます。

ありがとうございます!

 

江田篤史

お世話になっております。

一月ほど前にご教授頂きました方法を試させて頂きましたが、

何分初心者なもので、「orderBy is not defined」のエラーが出てしまいます。

どのように対処すればよいでしょうか?

度々申し訳ございません。

 

(function() {
“use strict”;
/**
* テーブルのソート
*
* @param Array table value(ex. event.record.Table.value)
* @param string orderBy フィールドコード(price)
* @param boolean isDesc ASC(false) or DESC(true)
*/

var sortTable = function(table, orderBys, isDesc) {
table.sort(function(a, b) {
for(orderBy of orderBys) {
var fieldType = a.value[orderBy].type;
var v1 = a.value[orderBy].value;
var v2 = b.value[orderBy].value;

// 数値と日時は変換してから比較
switch (fieldType) {
case ‘RECORD_NUMBER’:
case ‘NUMBER’:
var v1 = parseFloat(v1);
var v2 = parseFloat(v2);
break;
case ‘DATE’:
case ‘TIME’:
case ‘DATETIME’:
case ‘CREATED_TIME’:
case ‘UPDATED_TIME’:
var v1 = (new Date(v1)).getTime();
var v2 = (new Date(v2)).getTime();
break;
};

var pos = isDesc ? -1 : 1;
if (v1 > v2) {
return pos;
}
if (v1 < v2) {
return pos * -1;
}
}
});
};

// 登録、編集時の処理
kintone.events.on([“app.record.edit.submit”, “app.record.create.submit”], function(event) {
var table = event.record.進捗管理テーブル.value;
sortTable(table, [‘日付_4’, ‘時刻’], true);

return event;
});

})();

上記のコードでは時刻の比較はできないようでした。

初心者ながら試行錯誤し、汚いコードですが何とか実現できました。

以下、貼らせて頂きます。

 

(function() {
“use strict”;
/**
* テーブルのソート
*
* @param Array table value(ex. event.record.Table.value)
* @param string orderBy フィールドコード(price)
* @param boolean isDesc ASC(false) or DESC(true)
*/

var sortTable = function(table, orderBy, isDesc) {
table.sort(function(a, b) {
var fieldType = a.value[orderBy].type;
var v1 = a.value[orderBy].value;
var v2 = b.value[orderBy].value;

// 数値と日時は変換してから比較
switch (fieldType) {
case ‘RECORD_NUMBER’:
case ‘NUMBER’:
var v1 = parseFloat(v1);
var v2 = parseFloat(v2);
break;
case ‘DATE’:
case ‘TIME’:
case ‘DATETIME’:
case ‘CREATED_TIME’:
case ‘UPDATED_TIME’:
var v1 = (new Date(v1)).getTime();
var v2 = (new Date(v2)).getTime();
break;
};

var pos = isDesc ? -1 : 1;
if (v1 > v2) {
return pos;
}
if (v1 < v2) {
return pos * -1;
}
// 日付が同じであった場合、時刻を比較
if (v1 == v2) {
// Dateに直すと同値になりソート不可能なため、
// :で文字区切り。
// 時・分を別で比較する。
var z1 = (a.value[‘時刻’].value).split(“:”);
var z2 = (b.value[‘時刻’].value).split(“:”);

// 時を比較
if (z1[0] > z2[0]) {
return pos;
}
if (z1[0] < z2[0]) {
return pos * -1;
}
// 時が同値の場合、分で比較
if(z1[0] == z2[0]) {
if (z1[1] > z2[1]) {
return pos;
}
if (z1[1] < z2[1]) {
return pos * -1;
}
}
}
});
};

// 登録、編集時の処理
kintone.events.on([“app.record.edit.submit”, “app.record.create.submit”], function(event) {
var table = event.record.進捗管理テーブル.value;
sortTable(table, ‘日付_4’, true);

return event;
});

})();