Copy link to clipboard
Copied
On the attached file is a table. In it, I link to an XLSX and apply some styles (para and cells). Now, on import, the table doesn't adopt all these things and the borders etc. need to be removed and formatted... can't seem to bake those into the table style.
Also, the alternating fill I need (white/15%C) SHOULD be white first, after each sub heading. No tables doesn't support subheadings as such so I'm hoping there's a way to make the alternating fill restart after each para style change? Any ideas? All help really appreciated.
Hi @Smallbadger, if Eugene's link (a great article!) doesn't solve your problem I suspect it might be because of your subhead rows, which could complicate things. I've written a quick script to set each row of a table in alternating cell styles, resetting when encountering subhead rows. If you are happy to play with scripting, you may be able to adapt it to your specific needs.
To use it you will need to (1) add a new cell style called "BODY ALT", based on "BODY" and give it a cell fill colour of
...Copy link to clipboard
Copied
There's a good write up here that will have some excellent tips for you.
https://creativepro.com/preserve-the-appearance-of-text/
Copy link to clipboard
Copied
Hi @Smallbadger, if Eugene's link (a great article!) doesn't solve your problem I suspect it might be because of your subhead rows, which could complicate things. I've written a quick script to set each row of a table in alternating cell styles, resetting when encountering subhead rows. If you are happy to play with scripting, you may be able to adapt it to your specific needs.
To use it you will need to (1) add a new cell style called "BODY ALT", based on "BODY" and give it a cell fill colour of 15% cyan (or whatever) *and* set the BODY cell style's fill colour to "[Paper]" (or whatever you want). Once you've done that, select your table and run the script.
Note: The script explicitly applies the "SUBCELL" style to the subhead cells—comment out that line if you don't want this.
/*
by m1b
here: https://community.adobe.com/t5/indesign/need-urgent-help-with-alternating-table-fills/m-p/12190571#M438057
*/
// table cell style names:
var styleName1 = 'BODY',
styleName2 = 'BODY ALT',
subheadStyleName = "SUBCELL";
app.doScript(main, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "Set alternating table styles");
function main() {
if (app.selection.length == 0) {
alert('Please make a selection and run script again.');
} else if (!app.selection[0].parentStory.tables[0].isValid) {
alert('No table found in selection.');
} else {
var _table = app.selection[0].parentStory.tables[0];
var _rows = _table.rows;
var alternator = 0;
for (var i = 0; i < _rows.length; i++) {
if (_rows[i].rowType === RowTypes.BODY_ROW) {
if (_rows[i].cells.length == 1) {
// row is a subhead (all cells are merged into one)
setStyle(
app.activeDocument,
_rows[i].cells[0],
'cellStyle',
subheadStyleName,
true
);
// reset alternator flag
alternator = 0;
} else {
// set body cell style according to alternator flag
setStyle(
app.activeDocument,
_rows[i].cells.everyItem(),
'cellStyle',
alternator == 1 ? styleName2 : styleName1,
true
);
// switch the alternator between 0 and 1
alternator = (alternator + 1) % 2;
}
}
}
}
// just a convenience function for setting styles
function setStyle(doc, item, styleType, styleName, clearOverrides) {
if (doc == undefined || item == undefined || styleName == undefined) return;
if (clearOverrides == undefined) clearOverrides = true;
switch (styleType.toLowerCase()) {
case 'cellstyle':
if (doc.cellStyles.itemByName(styleName).isValid) {
item.appliedCellStyle = doc.cellStyles.itemByName(styleName);
if (clearOverrides) item.clearCellStyleOverrides(false);
} else {
throw ('Cell Style "' + styleName + '" not found.');
}
break;
case 'paragraphstyle':
if (doc.paragraphStyles.itemByName(styleName).isValid) {
item.texts[0].paragraphs.everyItem().appliedParagraphStyle = doc.paragraphStyles.itemByName(styleName);
if (clearOverrides) item.texts[0].clearOverrides(OverrideType.ALL);
} else {
throw ('Paragraph Style "' + styleName + '" not found.');
}
break;
case 'characterstyle':
if (doc.characterStyles.itemByName(styleName).isValid) {
item.texts[0].paragraphs.everyItem().appliedCharacterStyle = doc.characterStyles.itemByName(styleName);
if (clearOverrides) item.texts[0].clearOverrides(OverrideType.CHARACTER_ONLY);
} else {
throw ('Character Style "' + styleName + '" not found.');
}
break;
default:
throw ('Unrecognised styleType "' + styleType + '".');
break;
}
}
}
Let me know if that works for you.
- Mark
Edit: the downside of this script is that it will apply the style to the entire row, so if you have different cell styles for different columns, it won't work, although with a bit of finesse it can be adjusted. One possibility is to change the "clearOverrides" flag on the setStyles function calls to false, but it will depend on how the table is set up whether this works. Or you could adjust the script to set each cell of each row specifically.
Copy link to clipboard
Copied
This.... is amazing. Perfect!
You've saved me hours of work and shown me again, the power of this community. Thanks so much, and thanks to Eugene too, as that article did have some interesting bits on there for me too.
Again, thanks so much!
Copy link to clipboard
Copied
Nice!
Copy link to clipboard
Copied
This is excellent and solves my issue -- BUT, how do I modify the script for subheader rows that aren't all merged together (so separate columns but all have same style). Right now, the script skips any subheaders that aren't merged into 1 row, despite all cells in the row being SUBCELL style. Please help!! 🙂
Copy link to clipboard
Copied
This is excellent and solves my issue -- BUT, how do I modify the script for subheader rows that aren't all merged together (so separate columns but all have same style). Right now, the script skips any subheaders that aren't merged into 1 row, despite all cells in the row being SUBCELL style. Please help!! 🙂
Copy link to clipboard
Copied
Hi @rachelb2980007, here is a modified version for your case. Let me know how it goes. - Mark
/**
* Sets cell style of alternating rows, resetting at each subhead cell style row.
* To use, set the subheadCellStyleName and styleName1 and styleName2 in the settings object below.
* by m1b
* @discussion: https://community.adobe.com/t5/indesign/need-urgent-help-with-alternating-table-fills/m-p/12190571#M438057
*/
var settings = {
subheadCellStyleName: "SUBCELL",
styleName1: 'BODY',
styleName2: 'BODY ALT',
}
function main() {
var item = app.selection[0];
if (!item) {
alert('Please select a table and run script again.');
return;
}
var table = item;
if (table.parent && table.parent.constructor.name == 'Table')
table = table.parent;
if (
table.hasOwnProperty('parentStory')
&& table.parentStory.tables.length > 0
)
table = table.parentStory.tables[0];
if (
table.constructor.name !== 'Table'
&& table.tables.length > 0
)
table = table.tables[0];
if (table.constructor.name !== 'Table'
|| !table.isValid
) {
alert('No table selected. Please try again.');
return;
}
var rows = table.rows;
var alternator = 0;
for (var i = 0; i < rows.length; i++) {
if (rows[i].rowType !== RowTypes.BODY_ROW)
continue;
if (rows[i].cells[0].appliedCellStyle.name == settings.subheadCellStyleName) {
// row is a subhead style
// reset alternator flag
alternator = 0;
continue;
}
// set body cell style according to alternator flag
setStyle(
app.activeDocument,
rows[i].cells.everyItem(),
'cellStyle',
alternator == 0 ? settings.styleName1 : settings.styleName2,
true
);
// switch the alternator between 0 and 1
alternator = (alternator + 1) % 2;
}
};
app.doScript(main, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "Set alternating table styles");
/**
* Convenience function to set styles.
* @author m1b
* @param {Document} doc - an Indesign Document.
* @param {any} item - the target item, can be an everyItem().
* @param {String} styleType - "cellstyle", "paragraphstyle" or "characterstyle".
* @param {String } styleName - the name of the style.
* @param {Boolean} [clearOverrides] - whether to clean overrides (default: true).
*/
function setStyle(doc, item, styleType, styleName, clearOverrides) {
if (
doc == undefined
|| item == undefined
|| styleName == undefined
)
return;
clearOverrides = clearOverrides !== false;
switch (styleType.toLowerCase()) {
case 'cellstyle':
if (doc.cellStyles.itemByName(styleName).isValid) {
item.appliedCellStyle = doc.cellStyles.itemByName(styleName);
if (clearOverrides)
item.clearCellStyleOverrides(false);
}
else
throw ('Cell Style "' + styleName + '" not found.');
break;
case 'paragraphstyle':
if (doc.paragraphStyles.itemByName(styleName).isValid) {
item.texts[0].paragraphs.everyItem().appliedParagraphStyle = doc.paragraphStyles.itemByName(styleName);
if (clearOverrides)
item.texts[0].clearOverrides(OverrideType.ALL);
}
else
throw ('Paragraph Style "' + styleName + '" not found.');
break;
case 'characterstyle':
if (doc.characterStyles.itemByName(styleName).isValid) {
item.texts[0].paragraphs.everyItem().appliedCharacterStyle = doc.characterStyles.itemByName(styleName);
if (clearOverrides)
item.texts[0].clearOverrides(OverrideType.CHARACTER_ONLY);
}
else
throw ('Character Style "' + styleName + '" not found.');
break;
default:
throw ('Unrecognised styleType "' + styleType + '".');
break;
}
};
Copy link to clipboard
Copied
Thank you thank you!!!
I tried the new script and an error with line 73 popped up -- "setStyle is not a function". Is this something I can correct on my side?
Your help is much appreciated!
Copy link to clipboard
Copied
Hi @rachelb2980007, I'm not sure what's going wrong. Could you check that this line is in tact:
function setStyle(doc, item, styleType, styleName, clearOverrides) {
Or alternatively try copying the script again in case you missed anything. I'm away from my computer at the moment but when I get a chance I'll double check the script.
Copy link to clipboard
Copied
It worked!! I copied the entire script again and it works now! User error indeed. Thank you so so much for this -- you've saved me so much time and opened my eyes to the programming features within InDesign that I've never used before. ❤️ Have a wonderful day!
Copy link to clipboard
Copied
Excellent! Glad to help. 🙂