You'll certainly have to add some sort key because there is no way that the book order is predictable. A custom script with the book order hard coded is possible, but that's not straightforward.
One possibility is to add sort keys at the beginning of the entries. The keys can be numbers or letters. If you use numbers, use double-digit numbers if the number of books is larger than 9 (as you see I've no idea about the bible). You can leave the keys in place for future sorts if you want: apply a character style to them that hides them (apply 0.1 points type size, 1% horizontal scale, paper colour).
To sort the list you can use the script that Brian mentioned, but it is very slow. A quicker script is here:
https://creativepro.com/files/kahrel/indesign/sort.html
This is funny. I was just working on that solution.
It might be clunky and have potential issues but this is it so far:
Application.prototype.main = function() {
var theParagraphs = app.selection[0].paragraphs.everyItem().getElements();
//Add indexOf to prototype Array
Array.prototype.indexOf = function (elem, fromIndex){
fromIndex = Number(fromIndex) || 0;
var len = this.length;
if (fromIndex < 0){
fromIndex += len;
}
for(var i=fromIndex;i<this.length;i++){
if(this[i] == elem){
return i;
}
}
return -1;
}
var bookList = ["Genesis", "Exodus", "Leviticus", "Numbers", "Deuteronomy", "Joshua", "Judges", "Ruth", "1 Samuel", "2 Samuel", "1 Kings", "2 Kings", "1 Chronicles", "2 Chronicles", "Ezra", "Nehemiah", "Esther", "Job", "Psalms", "Proverbs", "Ecclesiastes", "Song of Solomon", "Isaiah", "Jeremiah", "Lamentations", "Ezekiel", "Daniel", "Hosea", "Joel", "Amos", "Obadiah", "Jonah", "Micah", "Nahum", "Habakkuk", "Zephaniah", "Haggai", "Zechariah", "Malachi", "Tobit", "Judith", "Ecclesiasticus (Sirach)", "Matthew", "Mark", "Luke", "John", "Acts", "Romans", "1 Corinthians", "2 Corinthians", "Galatians", "Ephesians", "Philippians", "Colossians", "1 Thessalonians", "2 Thessalonians", "1 Timothy", "2 Timothy", "Titus", "Philemon", "Hebrews", "James", "1 Peter", "2 Peter", "1 John", "2 John", "3 John", "Jude", "Revelation"];
var newList = [];
var bookNumber, bookName;
for (var i = 0; i < theParagraphs.length; i++) {
newList.push(theParagraphs[i].contents);
}
//add double digit sorting numbers
for (var i = 0; i < newList.length; i++) {
bookName = newList[i].split(" ")[0];
if (bookName == "1"||bookName == "2"||bookName == "3") {
bookName = newList[i].split(" ")[0] + " " + newList[i].split(" ")[1];
}
if (bookList.indexOf(bookName)<9) {
bookNumber = "0" +(bookList.indexOf(bookName)+1) + "_";
}
else{
bookNumber = (bookList.indexOf(bookName)+1) + "_";
}
newList[i] = bookNumber + newList[i];
}
//sort list
newList = newList.sort();
//this part removes the sorting-number
for (var i = 0; i < newList.length; i++) {
newList[i] = newList[i].replace(/^\d+_/g, "");
}
//paragraphs contents updated
for (var i = 0; i < theParagraphs.length; i++) {
theParagraphs[i].contents = newList[i];
}
}
app.doScript('app.main();',ScriptLanguage.JAVASCRIPT,undefined,UndoModes.ENTIRE_SCRIPT, undefined);
edit: added ^ to grep replace