如何使用脚本立即在 google 工作表中打印标记的列?
How to instantly print marked columns in google sheets with script?
我有 google 张文件 (img 1)。
https://i.stack.imgur.com/1j8ny.png[1]
我编写了将标记的列转换为文字的脚本(我只需要标记前 4 列,因为它会贴在贴纸上)(img 2)
https://i.stack.imgur.com/GnIXo.png[2]
这是代码:
SpreadsheetApp.getUi()
.createMenu('Drukowanie odpadów')
.addItem('Drukuj zazaczone odpady - ZAZNACZ 4 pierwsze kolumny!', 'sprawdz')
.addToUi();
/**
* @NotOnlyCurrentDoc
*/
function sprawdz() { //zbiera dane z zaznaczenia (4 kolumny) w arkuszu GoogleSheet, uzupełnia GoogleDoc danymi
// otworzenie dokumentu w google Doc, do którego będą przenoszone zaznaczone kolumny
var doc = DocumentApp.openByUrl("https://docs.google.com/document/d/WORD_ID/edit");
var body = doc.getBody();
//CZYSZCZENIE ORAZ USTAWIENIE WYMIARÓW ETYKIETY
body.clear();
body.setPageHeight(100);
body.setPageWidth(260);
body.setMarginLeft(0.1);
body.setMarginRight(0.1);
body.setMarginTop(0.01);
body.setMarginBottom(0.01);
var sheet = SpreadsheetApp.getActiveSheet();
var selection = sheet.getSelection();
var data = selection.getActiveRange().getValues();
//PIERWSZE UZUPEŁNIENIE DOKUMENTU
body.getParagraphs()[0].appendText(' {nr_odpadu} {dlugosc}').setFontSize(13);
body.appendParagraph(' {kolor}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(10);
body.appendParagraph(' {profil}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(10);
body.appendParagraph(' ').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(35);
//PETLA KTORA ZBIERA DANE Z ARKUSZA I UMIESZCZA JE W ODPOWIEDNIM MIEJSCU W DOKUMENCIE
for (var i = 0 ; i < data.length; i++) {
body.replaceText('{nr_odpadu}', data[i][0]);
body.replaceText('{profil}', data[i][1]);
body.replaceText('{kolor}', data[i][2]);
body.replaceText('{dlugosc}', data[i][3]+'mm');
//jeśli dotrzemy do końca listy, to nie ma potrzeby dalszego drukowania
if (i != data.length-1){
body.appendParagraph(' {nr_odpadu} {dlugosc}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(13);
body.appendParagraph(' {kolor}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(10);
body.appendParagraph(' {profil}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(10);
body.appendParagraph(' ').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(35);
}
}
}
是否有任何选项可以使用打印机从 google 工作表脚本编辑器中快速打印 word 文档?
F.e 我在 运行 脚本中标记了 4 列,然后它给我打印了贴纸。我正在使用打印机“Zebra GK420t”
我正在将其转换为 word 文档,因为当我将其转换为 pdf 时,我无法将页面大小更改为高度 100 和重量 260,而且我现在不知道如何在屏幕 2 上放置类似的东西
或者 mby 有一种方法可以在不创建 word/pdf 的情况下打印标记的列?
我能想到的最好的方法是用 CSS 制作一个 HTML 页面,准备打印为标签并使用浏览器进行打印。
这意味着制作一个模板并使用 HtmlService.createTemplateFromFile
(see docs) to generate a template, which then is evaluated into a web page. Then using Ui.showModelessDialog
(see docs) you show a dialog that can call window.print
(see MDN reference),以便您可以打印包含生成标签的 iframe
的内容。
function printLabels(labels) {
const labelsPage = HtmlService.createTemplateFromFile('Labels');
labelsPage.labels = labels;
SpreadsheetApp.getUi().showModelessDialog(labelsPage.evaluate(), 'Labels');
}
请注意,我们正在使用文件 Labels
。使用其他名称无效。
现在我们必须使用 HTML 和 CSS 制作标签的模板 (templated HTML docs),在设计时应考虑到印刷。我们还需要使用 JavaScript 来触发浏览器的打印对话框。
由于打印很难正确实施和调试,而且我有足够的动力,所以我花时间制作了一个与您现在拥有的类似的版本。显然,您可能需要对其进行一些更改。我从你的脚本中获取了尺寸,但我没有标签打印机——显然不是你的打印机——所以你必须进行一些测试以确保一切正常。
<!DOCTYPE html>
<html>
<head>
<!-- Basic CSS -->
<style type="text/css">
:root {
font-family: Helvetica, sans-serif;
}
:root, html, body {
margin: 0;
padding: 0;
}
article {
padding: 5pt;
}
header {
margin: 0;
line-height: 1em;
display: flex;
justify-content: space-between;
font-size: 13pt;
}
p {
margin: 0.7em;
padding: 0;
font-size: 10pt;
}
</style>
<!-- CSS to setup the printing -->
<style type="text/css" media="print">
@page {
/* Define the size of the page (label) */
size: 260pt 100pt;
/* Remove the page information that the browser usually adds */
margin: 0;
marks: crop;
}
body > * {
/* Make sure there is 1 article per page (label) */
page-break-after: always;
}
button {
/* Hide the print button when actually printing */
display: none;
}
</style>
<!-- Script that opens the print dialog after the page has completly loaded :) -->
<script>
// Show the printing dialog
window.addEventListener('load', function() {
window.print();
})
// Close after printing
window.addEventListener('afterprint', function() {
google.script.host.close();
});
</script>
</head>
<body>
<button type="button" onclick="window.print()">Print</button>
<? for (let label of labels) { ?>
<article>
<header>
<div><?= label[0] ?></div>
<div><?= label[1] ?>mm</div>
</header>
<p><?= label[2] ?></p>
<p><?= label[3] ?></p>
</article>
<? } ?>
</body>
</html>
现在您可以使用要打印的标签数组调用 printLabels
(在您的情况下,data
变量应该有效)。请注意,这将打印所有给定的标签,因此如果您只想打印 4,您应该只将 4 发送到该函数。
参考资料和进一步阅读
- CSS media queries (MDN)
- CSS flexbox (MDN)
- CSS units (MDN)
- CSS @page (MDN)
- Can I remove the URL from my print css, so the web address doesn't print? (Whosebug)
- google.script.host.close() (Google Apps Script reference)
我有 google 张文件 (img 1)。
https://i.stack.imgur.com/1j8ny.png[1]
我编写了将标记的列转换为文字的脚本(我只需要标记前 4 列,因为它会贴在贴纸上)(img 2)
https://i.stack.imgur.com/GnIXo.png[2]
这是代码:
SpreadsheetApp.getUi()
.createMenu('Drukowanie odpadów')
.addItem('Drukuj zazaczone odpady - ZAZNACZ 4 pierwsze kolumny!', 'sprawdz')
.addToUi();
/**
* @NotOnlyCurrentDoc
*/
function sprawdz() { //zbiera dane z zaznaczenia (4 kolumny) w arkuszu GoogleSheet, uzupełnia GoogleDoc danymi
// otworzenie dokumentu w google Doc, do którego będą przenoszone zaznaczone kolumny
var doc = DocumentApp.openByUrl("https://docs.google.com/document/d/WORD_ID/edit");
var body = doc.getBody();
//CZYSZCZENIE ORAZ USTAWIENIE WYMIARÓW ETYKIETY
body.clear();
body.setPageHeight(100);
body.setPageWidth(260);
body.setMarginLeft(0.1);
body.setMarginRight(0.1);
body.setMarginTop(0.01);
body.setMarginBottom(0.01);
var sheet = SpreadsheetApp.getActiveSheet();
var selection = sheet.getSelection();
var data = selection.getActiveRange().getValues();
//PIERWSZE UZUPEŁNIENIE DOKUMENTU
body.getParagraphs()[0].appendText(' {nr_odpadu} {dlugosc}').setFontSize(13);
body.appendParagraph(' {kolor}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(10);
body.appendParagraph(' {profil}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(10);
body.appendParagraph(' ').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(35);
//PETLA KTORA ZBIERA DANE Z ARKUSZA I UMIESZCZA JE W ODPOWIEDNIM MIEJSCU W DOKUMENCIE
for (var i = 0 ; i < data.length; i++) {
body.replaceText('{nr_odpadu}', data[i][0]);
body.replaceText('{profil}', data[i][1]);
body.replaceText('{kolor}', data[i][2]);
body.replaceText('{dlugosc}', data[i][3]+'mm');
//jeśli dotrzemy do końca listy, to nie ma potrzeby dalszego drukowania
if (i != data.length-1){
body.appendParagraph(' {nr_odpadu} {dlugosc}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(13);
body.appendParagraph(' {kolor}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(10);
body.appendParagraph(' {profil}').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(10);
body.appendParagraph(' ').setAlignment(DocumentApp.HorizontalAlignment.LEFT).editAsText().setFontSize(35);
}
}
}
是否有任何选项可以使用打印机从 google 工作表脚本编辑器中快速打印 word 文档?
F.e 我在 运行 脚本中标记了 4 列,然后它给我打印了贴纸。我正在使用打印机“Zebra GK420t”
我正在将其转换为 word 文档,因为当我将其转换为 pdf 时,我无法将页面大小更改为高度 100 和重量 260,而且我现在不知道如何在屏幕 2 上放置类似的东西
或者 mby 有一种方法可以在不创建 word/pdf 的情况下打印标记的列?
我能想到的最好的方法是用 CSS 制作一个 HTML 页面,准备打印为标签并使用浏览器进行打印。
这意味着制作一个模板并使用 HtmlService.createTemplateFromFile
(see docs) to generate a template, which then is evaluated into a web page. Then using Ui.showModelessDialog
(see docs) you show a dialog that can call window.print
(see MDN reference),以便您可以打印包含生成标签的 iframe
的内容。
function printLabels(labels) {
const labelsPage = HtmlService.createTemplateFromFile('Labels');
labelsPage.labels = labels;
SpreadsheetApp.getUi().showModelessDialog(labelsPage.evaluate(), 'Labels');
}
请注意,我们正在使用文件 Labels
。使用其他名称无效。
现在我们必须使用 HTML 和 CSS 制作标签的模板 (templated HTML docs),在设计时应考虑到印刷。我们还需要使用 JavaScript 来触发浏览器的打印对话框。
由于打印很难正确实施和调试,而且我有足够的动力,所以我花时间制作了一个与您现在拥有的类似的版本。显然,您可能需要对其进行一些更改。我从你的脚本中获取了尺寸,但我没有标签打印机——显然不是你的打印机——所以你必须进行一些测试以确保一切正常。
<!DOCTYPE html>
<html>
<head>
<!-- Basic CSS -->
<style type="text/css">
:root {
font-family: Helvetica, sans-serif;
}
:root, html, body {
margin: 0;
padding: 0;
}
article {
padding: 5pt;
}
header {
margin: 0;
line-height: 1em;
display: flex;
justify-content: space-between;
font-size: 13pt;
}
p {
margin: 0.7em;
padding: 0;
font-size: 10pt;
}
</style>
<!-- CSS to setup the printing -->
<style type="text/css" media="print">
@page {
/* Define the size of the page (label) */
size: 260pt 100pt;
/* Remove the page information that the browser usually adds */
margin: 0;
marks: crop;
}
body > * {
/* Make sure there is 1 article per page (label) */
page-break-after: always;
}
button {
/* Hide the print button when actually printing */
display: none;
}
</style>
<!-- Script that opens the print dialog after the page has completly loaded :) -->
<script>
// Show the printing dialog
window.addEventListener('load', function() {
window.print();
})
// Close after printing
window.addEventListener('afterprint', function() {
google.script.host.close();
});
</script>
</head>
<body>
<button type="button" onclick="window.print()">Print</button>
<? for (let label of labels) { ?>
<article>
<header>
<div><?= label[0] ?></div>
<div><?= label[1] ?>mm</div>
</header>
<p><?= label[2] ?></p>
<p><?= label[3] ?></p>
</article>
<? } ?>
</body>
</html>
现在您可以使用要打印的标签数组调用 printLabels
(在您的情况下,data
变量应该有效)。请注意,这将打印所有给定的标签,因此如果您只想打印 4,您应该只将 4 发送到该函数。
参考资料和进一步阅读
- CSS media queries (MDN)
- CSS flexbox (MDN)
- CSS units (MDN)
- CSS @page (MDN)
- Can I remove the URL from my print css, so the web address doesn't print? (Whosebug)
- google.script.host.close() (Google Apps Script reference)