Copy link to clipboard
Copied
I have a book that contains over 2,500 phone numbers that I update twice a year in InDesign and then export it into PDF. I just discovered a way for recipients of this PDF to save it to their iBooks app to then have the ability to access it from their mobile devices (iPhones, for the most part), where they can just click on a particular phone number and have their device automatically dial out to that number. Since there are SO many numbers provided in my book, is there an easy way to convert/program all of the numbers to essentially do the same function - call when clicked - all in one fell swoop, instead of converting each individual phone number into a hyperlink? There has to be some code or script to accomplish this - can someone please help? Thanks!
Here is a version of the script that adds a progress bar (which apparently doesn't always show on certain versions of Mac). In a clean new document with just 2,500 phone numbers the script runs almost a minute on my (almost new, well-specced) PC (in CC2015 and 2017). The progress bar shows that the script tears off furiously, then slows down after about 500 links, and crawls to the finish. But do try a test on a document with a few dozen numbers.
Peter
...#targetengine phone_numbers;
(function () {
Copy link to clipboard
Copied
I used the first one at the top, the one chosen as the correct answer. HEre it is:
#targetengine phone_numbers;
(function () {
var i;
var w;
var cStyle;
var found;
var source;
var destination;
app.scriptPreferences.enableRedraw = true;
try {
app.panels.item('$ID/Hyperlinks').visible = false;
} catch (_) {
}
if (!app.documents[0].characterStyles.item ('Hyperlink').isValid) {
app.documents[0].characterStyles.add ({name: 'Hyperlink', underline: true});
}
cStyle = app.documents[0].characterStyles.item ('Hyperlink');
app.findGrepPreferences = null;
app.findGrepPreferences.findWhat = /\(\d\d\d\)\s\d\d\d-\d\d\d\d/.source;
found = app.documents[0].findGrep();
w = new Window ('palette {text: "Phone URLs"}');
w.pbar = w.add ('progressbar', undefined, 0, found.length);
w.pbar.preferredSize.width = 300;
w.show();
for (i = 0; i < found.length; i++) {
w.pbar.value = i+1;
source = app.documents[0].hyperlinkTextSources.add (found, {appliedCharacterStyle: cStyle});
destination = app.documents[0].hyperlinkURLDestinations.add ({
destinationURL: 'tel:' + found.contents.replace(/\D/g,'')
});
app.documents[0].hyperlinks.add (source, destination);
}
try {
w.close();
} catch (_) {
}
}());
Copy link to clipboard
Copied
Spotted two errors that clearly were done by transferring this thread to the new forum.
Hope I found all. Try the code below; I did not test it:
#targetengine phone_numbers;
(function () {
var i;
var w;
var cStyle;
var found;
var source;
var destination;
app.scriptPreferences.enableRedraw = true;
try {
app.panels.item('$ID/Hyperlinks').visible = false;
} catch (_) {
}
if (!app.documents[0].characterStyles.item ('Hyperlink').isValid) {
app.documents[0].characterStyles.add ({name: 'Hyperlink', underline: true});
}
cStyle = app.documents[0].characterStyles.item ('Hyperlink');
app.findGrepPreferences = null;
app.findGrepPreferences.findWhat = /\(\d\d\d\)\s\d\d\d-\d\d\d\d/.source;
found = app.documents[0].findGrep();
w = new Window ('palette {text: "Phone URLs"}');
w.pbar = w.add ('progressbar', undefined, 0, found.length);
w.pbar.preferredSize.width = 300;
w.show();
for (i = 0; i < found.length; i++) {
w.pbar.value = i+1;
source = app.documents[0].hyperlinkTextSources.add( found[i], {appliedCharacterStyle: cStyle} );
destination = app.documents[0].hyperlinkURLDestinations.add ({
destinationURL: 'tel:' + found[i].contents.replace(/\D/g,'')
});
app.documents[0].hyperlinks.add (source, destination);
}
try {
w.close();
} catch (_) {
}
}());
Regards,
Uwe Laubender
( ACP )
Copy link to clipboard
Copied
Thank you for answering so quickly. Unfortunately, I'm getting the same error as before (error 30477 on line 59). Maybe I'm adding the file incorrectly--I just move it to the scripts panel folder and save it with a ".jsx" extension.
Copy link to clipboard
Copied
Are you sure you copied the new code?
There is no line 59 in the script. The new code ends with line 52.
Regards,
Uwe Laubender
( ACP )
Copy link to clipboard
Copied
THANK YOU THANK YOU THANK YOU THANK YOU
This is a miracle. I really appreciate it! It works great.
Copy link to clipboard
Copied
I was able to get this to work as well. Thank you so much for taking the time to solve this challenge!
Copy link to clipboard
Copied
Can someone please explain what's ".source" for in this line?
app.findGrepPreferences.findWhat = /\(\d\d\d\)\s\d\d\d-\d\d\d\d/.source
Copy link to clipboard
Copied
Hi @Thunder-Lightning ,
using .source is a different way to get that regular expression without declaring it explicitly as string.
With a string you'd have to escape every backslash with another backslash.
Regards,
Uwe Laubender
( Adobe Community Expert )
Copy link to clipboard
Copied
Thanks for explaining that, I was wondering that myself...though, I have no scripting experience. I was getting an error on the earlier attempts and the error cited ".source" as part of the issue. Maybe someday I'll figure it all out! 🙂
Copy link to clipboard
Copied
Thank you, @Laubender .
Is 'source' here referring to the variable?
Copy link to clipboard
Copied
Hello, I've just tried to use the script and it seemed to work, even while I've changed the GREP search. But it doesn't work at all: it creates some phone URL, but that it stops with an error message (code error 79111) that says that the chosen object is yet in use for another hyperlink, or something like that (I'm italian and I'm using the italian version of Indesign, so I don't know how this code error is originally in english).
Could anyone help me? I'm not very experienced with scripts and similar things...
Copy link to clipboard
Copied
Crealibro, if you face this issue again, you may want to make a duplicate copy of your document and remove all existing hyperlinks (you could even just duplicate a portion of the original document), then run it again. What may be happening is that an existing hyperlink is overlapped with the phone number (meaning, a portion of the phone number is part of that hyperlink, perhaps by accident). It could be that it happened due to a search and replace where you might not have known the hyperlink was formed that way. Also, if your hyperlinks all have a character style or paragraph style, you can search for a string like "(\d\d\d)" that has that style applied, and then see which of those is also part of an existing hyperlink. Drop that one into another doc, run the script on it, then paste it back into your original document. Just ideas...good luck!