【问题标题】:Copy from Google Sheets to Google Docs without Formatting Changes从 Google 表格复制到 Google 文档,无需更改格式
【发布时间】:2020-03-10 12:12:28
【问题描述】:

我创建了一个 Google 表格,我需要在其中复制一些带有粗体和斜体等格式的单元格。我必须将每个带有格式的单元格复制到 Google Docs 而不更改其格式。这是我使用的代码,但它只复制没有格式的数据。我不希望它格式化,因为有时它取决于作者如何格式化文本,所以我只需要按原样复制它而不更改格式。我应该如何使用单元格内的格式复制它?

  var sourceSS = SpreadsheetApp.getActive();
  var ss = sourceSS.setActiveSheet(sourceSS.getSheetByName(tabName));
  var newDoc = DocumentApp.openById(target);

  var headertxt = ss.getRange('A32').getValues();
  var subjtxt = "Subject: ";
  var subjtitle = ss.getRange('D33').getValues();
  var copytxt = ss.getRange('D34:D').getValues();
  var rowCnt = copytxt.filter(String).length;

  var rowStart = 34;
  var txt = ss.getRange(rowStart, 4, rowStart+rowCnt, 1).getValues();

  var body = newDoc.getBody();

  var header = body.appendParagraph(headertxt+'\n');
  header.setBold(false);
  header.setHeading(DocumentApp.ParagraphHeading.HEADING4);


  var subj = body.appendParagraph(subjtxt + subjtitle +'\n');
  subj.setBold(true);


  var table = body.appendTable(txt);
  table.setBorderWidth(0);
  table.setBold(false);

  var newPage = body.appendPageBreak();

我实际上是在尝试将其应用于 var 表,因为它包含具有文本格式的单元格。

谢谢!

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,从您的问题中,我看不到您期望的结果。因此,为了正确了解您的情况,您能否提供您期望的示例电子表格和示例结果?当然,请删除您的个人信息。
  • 愿景是按原样复制单元格。每个单元格都包含带有粗体和斜体的文本以及一些常规文本,但是当它被粘贴到 Google Doc 时,它会删除格式。我需要按原样复制它们而不更改单元格中的文本格式。
  • 这是截图。 Google Sheet 单元格,当它被复制到 Google Docs 时,结果是红色箭头。它应该在哪里,结果应该是不应该更改的绿色箭头。希望这可以帮助。 drive.google.com/file/d/11oFG4zDJR4WqyAfAuTcv9M4x-6DtwCGM/…
  • 感谢您的回复。很遗憾,我无法打开您的共享文件。但是我注意到已经发布了答案。我认为它会解决您的问题。
  • 不,还没有回答,仍然无法交付。 :(

标签: google-apps-script google-sheets google-docs


【解决方案1】:

由于您拥有包含所需值的范围,因此您可以使用getBackgroundgetFontWeightgetFontStylegetFontSizegetFontColors 等方法来检索您需要复制的信息。

然后您可以使用setAttributes 复制您在将段落插入文档时获得的值。

【讨论】:

  • 但范围包含带格式和不带格式的组合文本,
  • 一个单元格包含粗体、斜体和不带斜体和粗体的常规文本。需要照原样复制它们。 setAttributes 设置为特定单元格,它将所有文本转换为粗体。
  • 您必须处理样式数组并相应地在段落中插入数据。
  • 怎么办?我对数组不是很熟悉,抱歉
  • @Tanaike 这不是解决方案。我在电子表格中有教师 cmets。每个单元格包含一个或多个具有多种样式的句子:粗体、斜体、换行、字体大小变化等。从工作表复制到文档时,所有格式都会丢失。还记得老师是如何标记的吗?你应该做 this 而不是 that。新行更多建议...
【解决方案2】:

我写了两个函数。第一个以富文本形式获取单元格的内容,并将文本和属性作为单独的运行存储在对象数组中。每次运行都有一个对象。 getRichTextValue 记录在这里https://developers.google.com/apps-script/reference/spreadsheet/rich-text-value

function getRichTextCell(fdbkRgA1) {
  console.log('Begin getRichTextCell input fdbkRgA1: ', fdbkRgA1 );
  
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const sheet = ss.getActiveSheet();
  const inRng = sheet.getRange(fdbkRgA1);

  let richText = ss.getRange(fdbkRgA1).getRichTextValue(); 
  let thisText = richText.getText(); 
  // console.log('Cell content: ' + thisText);
  let runsArr = richText.getRuns(); 
  // console.log('runs length: ' + runsArr.length );
  
  let rtObjArr = [];
  for ( i = 0 ; i < runsArr.length ; i++ )    { 

    // get the style of this section of text, between startIndex and endIndex 
    let run = runsArr[i]; 
    let runtext = run.getText();
    let color = run.getTextStyle().getForegroundColor();
    let font = run.getTextStyle().getFontFamily();
    let fontsize = run.getTextStyle().getFontSize();
    let startIndex = run.getStartIndex(); 
    let endIndex = run.getEndIndex(); 
    let styleBold = run.getTextStyle().isBold(); 
    let styleItalic = run.getTextStyle().isItalic();
    let stylesThru = run.getTextStyle().isStrikethrough();
    let styleUline = run.getTextStyle().isUnderline();
    // console.log('i: ', i, ' Start Idx: ', startIndex, 
    //                       ' End Idx: ', endIndex, 
    //                       ' Text: ', runtext, 
    //                       ' Bold?: ', styleBold, 
    //                       ' Color: ', color, 
    //                       ' Font: ', font, 
    //                       ' Size: ', fontsize, 
    //                       ' Italic?: ', styleItalic, 
    //                       ' Strikethru?: ', stylesThru, 
    //                       ' Underline?: ', styleUline);
    rtObjArr.push ({
                    'StartIdx' : startIndex, 
                    'EndIdx' : endIndex, 
                    'Text' : runtext, 
                    'Bold' : styleBold, 
                    'Color' : color, 
                    'Font' : font, 
                    'Size' : fontsize, 
                    'Italic' : styleItalic, 
                    'Strikethru' : stylesThru, 
                    'Underline' : styleUline
                  });

  } 
  
  return rtObjArr;
}

第二个函数接收带有富文本和属性运行的对象,并将其添加到现有文档的顶部或底部。

function setRichTextDoc(rtObjArr, stuDoc, TorB, docTit) {
  console.log('Begin setRichTextDoc input docTit: ', docTit);
  
  let numRuns = rtObjArr.length;
  // console.log('numRuns: ', numRuns);
  if ( numRuns === 0 ) {
    console.log('No feedback found for student doc.' + docTit +
                '\nSKIPPING' );
    ui.alert('No feedback found for student doc.' + docTit +
             '\nSKIPPING');
    return;
  }
  
  let theTxt, runtext, color, font, fontsize, para,
      styleBold, styleItalic, stylesThru, styleUline;
 
  if ( TorB === 'BOTTOM' )  {
    // console.log('begin before stuff BOTTOM');
    stuDoc.appendHorizontalRule();
    para = stuDoc.appendParagraph('Feedback on Current Draft');
    para.setForegroundColor('#000000')
        .setAlignment(DocumentApp.HorizontalAlignment.CENTER)
        .setBold(true); 
    para = stuDoc.appendParagraph("")  
  }    else    {
    // console.log('begin before stuff TOP');
    para = stuDoc.insertParagraph(0, "")
    stuDoc.insertHorizontalRule(1);
    para = stuDoc.insertParagraph(2, 'Final Comments');      
    para.setForegroundColor('#000000')
        .setAlignment(DocumentApp.HorizontalAlignment.CENTER)
        .setBold(true);
    para = stuDoc.insertParagraph(3, "")  
  }
      
  for ( i = 0 ; i < numRuns ; i++ ) {
    console.log ('i: ', i, ' stringify input object\n', JSON.stringify(rtObjArr[i]) );
    runtext  = rtObjArr[i].Text;
    color = rtObjArr[i].Color;
    font = rtObjArr[i].Font;
    fontsize = rtObjArr[i].Size; 
    styleBold = rtObjArr[i].Bold; 
    styleItalic = rtObjArr[i].Italic;
    stylesThru = rtObjArr[i].Strikethru;
    styleUline = rtObjArr[i].Underline;
    
    if ( TorB === 'BOTTOM' )  {
      // console.log('begin rich text BOTTOM');
      theTxt = para.appendText(runtext);  //  Exception: Cannot insert an empty text element.
      // theTxt = stuDoc.appendText(runtext);  //  Err: TypeError: stuDoc.appendText is not a function
      // theTxt = stuDoc.appendParagraph(runtext);  //  runs but nothing stored
      theTxt.setFontFamily(font)
            .setFontSize(fontsize)
            .setForegroundColor(color)
            .setBold(styleBold) 
            .setItalic(styleItalic) 
            .setStrikethrough(stylesThru)
            .setUnderline(styleUline);
    }    else    {
      // console.log('begin rich text TOP');
      theTxt = para.appendText(runtext);
      theTxt.setFontFamily(font)
            .setFontSize(fontsize)
            .setForegroundColor(color)
            .setBold(styleBold) 
            .setItalic(styleItalic) 
            .setStrikethrough(stylesThru)
            .setUnderline(styleUline);
    }

    // console.log ('i: ', i, ' finished' );
  }
  
  if ( TorB === 'BOTTOM' )  {
    console.log('begin after stuff BOTTOM');
    para = stuDoc.appendParagraph('Create Your Next Draft Below');
    para.setAlignment(DocumentApp.HorizontalAlignment.CENTER)
    .setBold(true);
    stuDoc.appendHorizontalRule();
  }    else    {
    console.log('begin after stuff TOP');
    stuDoc.insertHorizontalRule(4);
    stuDoc.insertParagraph(5, '');
  }
  
  console.log('End setRichTextDoc');
}

代码保留新行和左水平对齐,即使这些不是可用的属性。 如果没有@Chris Google Docs Script: appendText/insertText Formatting 的帮助,我无法解决这个问题@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2022-09-22
    • 1970-01-01
    相关资源
    最近更新 更多