Skip to content

Instantly share code, notes, and snippets.

@dot
Last active August 29, 2015 14:01
Show Gist options
  • Save dot/8f7c6983885ff3d059f7 to your computer and use it in GitHub Desktop.
Save dot/8f7c6983885ff3d059f7 to your computer and use it in GitHub Desktop.
GAS google docs auto sequencer
var _ = Underscore.load();
var HeadingCounter,
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
HeadingCounter = (function() {
HeadingCounter.name = 'HeadingCounter';
HeadingCounter.HEADINGS = [DocumentApp.ParagraphHeading.HEADING1.toString(),
DocumentApp.ParagraphHeading.HEADING2.toString(),
DocumentApp.ParagraphHeading.HEADING3.toString(),
DocumentApp.ParagraphHeading.HEADING4.toString(),
DocumentApp.ParagraphHeading.HEADING5.toString(),
DocumentApp.ParagraphHeading.HEADING6.toString()];
function HeadingCounter() {
this.counter = {};
this.reset();
}
HeadingCounter.prototype.reset = function(level) {
var h, i, _i, _len, _level, _ref;
if (level == null) level = DocumentApp.ParagraphHeading.HEADING1;
_level = level.toString();
i = HeadingCounter.HEADINGS.indexOf(_level);
_ref = HeadingCounter.HEADINGS.slice(i);
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
h = _ref[_i];
this.counter[h] = 0;
}
};
HeadingCounter.prototype.increment = function(level) {
var _level;
_level = level.toString();
if (this.counter.hasOwnProperty(_level)) {
this.counter[_level]++;
var next_level = HeadingCounter.HEADINGS[HeadingCounter.HEADINGS.indexOf(_level)+1];
this.reset(next_level);
}
return this.counter[_level];
};
HeadingCounter.prototype.sequence = function(level) {
var i, _level;
_level = level.toString();
if (__indexOf.call(HeadingCounter.HEADINGS, _level) >= 0) {
i = HeadingCounter.HEADINGS.indexOf(_level);
var _this = this;
return _.map(HeadingCounter.HEADINGS.slice(0, i + 1 || 9e9), function(num) {
return _this.counter[num];
});
} else {
return;
}
};
return HeadingCounter;
})();
function onOpen() {
// Add a menu with some items, some separators, and a sub-menu.
DocumentApp.getUi().createMenu('Sequencer')
.addItem('実行', 'execute')
.addToUi();
}
function execute() {
var body = DocumentApp.getActiveDocument().getBody();
var paragraphs = body.getParagraphs();
var counter = new HeadingCounter();
for each (p in paragraphs) {
var h = p.getHeading();
counter.increment(h);
var level = counter.sequence(h)
if (level) {
p.setText(replace_heading(level, p.getText()));
}
}
}
function replace_heading(level, text) {
var stripped;
stripped = text.replace(/^(\d\+.){1,}/i, '').replace(/(^\s+)|(\s+$)/g, "");
level.push(' ');
return level.join('.') + stripped;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment