如何使用脚本立即在 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 发送到该函数。

参考资料和进一步阅读