使用 basil.js 从 CSV 将数据导入 InDesign
Importing Data to InDesign from a CSV with basil.js
我正在尝试使用 basil.js 将 CSV 文件导入到 InDesign 文档中。但是,根据数据集,我经常会得到以下错误:
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() {
我的脚本基于此 Working with CSV files 演示,只是我对其进行了修改,因此每行只显示一行数据,并且每 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 行的数据集 – here is a sample dataset,但当行数不同时,它将 return 错误。即使在这种情况下,如果我要更改 for 循环以便每页显示 5 行,它也会中断。
非常感谢任何帮助。谢谢!
更改嵌套循环中的行数对我来说也会破坏脚本。我认为您应该稍微清理一下代码。
- 您在循环之前声明
var i = 0;
,然后在 i
循环内声明。
- 您正在
y
内递增 i
。
- 那么
y
循环中的if(i > data.length) break
也是一个东西。当 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;
}
}
我还建议更新到 latest release。我们修复了一些错误并使 basil.js 文件自包含。您的错误指向旧版本,其中文件仍然分开。只需将捆绑文件夹中的 basil.js 替换为下载的那个即可。
我正在尝试使用 basil.js 将 CSV 文件导入到 InDesign 文档中。但是,根据数据集,我经常会得到以下错误:
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() {
我的脚本基于此 Working with CSV files 演示,只是我对其进行了修改,因此每行只显示一行数据,并且每 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 行的数据集 – here is a sample dataset,但当行数不同时,它将 return 错误。即使在这种情况下,如果我要更改 for 循环以便每页显示 5 行,它也会中断。
非常感谢任何帮助。谢谢!
更改嵌套循环中的行数对我来说也会破坏脚本。我认为您应该稍微清理一下代码。
- 您在循环之前声明
var i = 0;
,然后在i
循环内声明。 - 您正在
y
内递增i
。 - 那么
y
循环中的if(i > data.length) break
也是一个东西。当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;
}
}
我还建议更新到 latest release。我们修复了一些错误并使 basil.js 文件自包含。您的错误指向旧版本,其中文件仍然分开。只需将捆绑文件夹中的 basil.js 替换为下载的那个即可。