Импорт данных в 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 строк, он сломается.

Любая помощь горячо приветствуется. Благодарю вас!


person christopher    schedule 23.04.2017    source источник


Ответы (1)


Изменение количества строк в вашем вложенном цикле также нарушает сценарий для меня. Я думаю, вам следует немного почистить свой код.

  1. Вы объявляете var i = 0; перед циклом, а затем внутри цикла i.
  2. Вы увеличиваете i в своем y.
  3. Тогда if (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 в папке пакета на файл из загрузки, и все готово.

person fabianmoronzirfas    schedule 23.04.2017
comment
Спасибо за быстрый ответ! это решило мою проблему. однако импорт набора данных из 1800 строк или около того привел к сбою моего InDesign: P - person christopher; 24.04.2017
comment
Вы пытались преобразовать его в JSON и включить напрямую? npmjs.com/package/babyparse ? - person fabianmoronzirfas; 24.04.2017