Импорт данных в InDesign из CSV с помощью basil.js
Я пытаюсь импортировать CSV в документ InDesign, используя basil.js. Однако, в зависимости от набора данных, я часто получаю сообщение об ошибке:
Javascript Error!
Error Number: 21
Error String: undefined object is not an object
Engine: main
File: /Users/...
includes/core.js
Line: 137 Source:
app.doScript(function() {
Мой сценарий основан на демонстрации " Работа с CSV-файлами", за исключением того, что я изменил его, чтобы в каждой строке была представлена только одна строка данных, и он вставляет новую страницу каждые 4 строки. Это мой сценарий:
#includepath "~/Documents/;%USERPROFILE%Documents";
#include "basiljs/bundle/basil.js";
function draw() {
// load & convert
var data = b.CSV.decode( b.loadString("donorsopenS.csv") );
for (var i = 0; i < data.length; i++) {
data[i].Zip = parseInt(data[i].Zip);
};
// text settings
b.textSize(12);
b.textFont('Helvetica');
b.textAlign(Justification.LEFT_ALIGN);
b.units(b.MM);
var i = 0;
var verticalUnitSize = 20;
var horizontalUnitSize = 50;
for ( var i = 0; i < data.length; i++ ) {
for (var y = 0; y < 4; y++) {
var posX = horizontalUnitSize;
var posY = y*(verticalUnitSize);
var Contributor = data[i].Contributor;
var PositionBoard = data[i].PositionBoard;
var Amount = data[i].Amount;
var Recipient = data[i].Recipient;
b.text(Contributor, 0, posY,50,20);
b.text(PositionBoard, posX, posY,50,20);
b.text(Amount, posX*2, posY,50,20);
b.text(Recipient, posX*3, posY,50,20);
// stop drawing if no more rows are available
if (i > data.length) break;
i++;
};
// add new page
if (i < data.length-1) {
b.addPage();
}
}
}
b.go();
Он отлично работает с набором данных из 10 строк - вот примерный набор данных, но когда количество строк будет разным, он вернет ошибку. Даже в этом случае, если бы я изменил цикл for, чтобы на каждой странице отображалось 5 строк, он разрывается.
Буду признателен за любую оказанную помощь. Спасибо!
1 ответ
Изменение количества строк в вашем вложенном цикле также нарушает сценарий для меня. Я думаю, вы должны немного очистить свой код.
- Вы декларируете
var i = 0;
до цикла, а затем вi
петля. - Вы увеличиваете
i
в вашемy
, - Тогда если
(i > data.length) break
вy
петля тоже вещь. Это в конечном итоге остановится, когдаi
цикл достигает конца data.length.
Вы меняете условия для одного цикла во встроенном.
Я бы предложил иметь один цикл для строк и вложенный цикл для столбцов. y
переменная, объявленная ранее и будет увеличена во внешнем цикле. Если y
больше, чем b.height добавить новую страницу. Во внутреннем цикле для столбцов вы добавляете свой контент в текстовый фрейм и увеличиваете x
что объявлено в первом цикле.
Это может быть что-то вроде этого:
var y = 0;
// width and height for the textbox
var w = 10;
var h = 10;
for(var row = 0; row < data.length; row++) {
var x = 0;
for(var column in data[row]) {
// we need this check if we use
// for var key in object loops
if(data[row].hasOwnProperty(column)){
b.println(data[row][column]); // just take a look
// add some text boxes here
// b.text(data[row][column], x, y, w, h);
x++; // or x = x + w;
}
}
y++; // y = y + h;
if(y >= b.height){
b.addPage();
y = 0;
}
}
Также я предлагаю обновить до последней версии. Мы исправили некоторые ошибки и сделали файл basil.js автономным. Ваша ошибка указывает на более старую версию, где файлы все еще разделены. Просто замените basil.js в папке вашего пакета на тот, который загружен, и все готово.