首页 > 解决方案 > 如何让自动添加的行显示在 Google 表格的顶部

问题描述

我对此很陌生,所以请多多包涵。

我有一个 Google 表格,它使用脚本将某些电子邮件的正文拉入 Google 表格。然后我使用表格中的“左”和“右”功能将文本分解成有用的小块。然后,我在工作表的第一页上显示了有用的信息,这样我就可以看到谁发​​送了电子邮件、他们的电话号码、他们想要什么等。所有这些都很好,但是当我收到一封新电子邮件时,它会添加信息到工作表的底部,我非常希望在顶部添加新信息(但仍然在我的标题下方 - 第 2 行)。

我可以举一个例子,如果有帮助的话,甚至可以访问工作表。

提前致谢。

编辑:这是我到目前为止所拥有的:

function myFunction() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('NAME');

  var label = GmailApp.getUserLabelByName("LABEL");
  var threads = label.getThreads();

  for (var i=0; i<threads.length; i++)
  {
    var messages = threads[i].getMessages();

    for (var j=0; j<messages.length; j++)
    {
      if (messages[j].isUnread())
          {
            var msg = messages[j].getBody();      
            sheet.appendRow([msg]);
            messages[j].markRead();
          }
    }
      threads[i].removeLabel(label);
  }
}

老实说,我不明白这是在做什么,但我已经从这里的其他答案拼凑起来,它似乎做了我想做的事,所以我会接受它。

标签: google-apps-scriptgoogle-sheets

解决方案


你说:I have a Google Sheet that uses a script to pull the body text of certain emails into Google Sheets.

因此,该脚本应该在您想要的任何位置插入一个新行,并将该信息复制到该新行中。

你说:it gets added with appendRow

所以将参数ofappendRow(parameter)并粘贴到以下函数中作为rowArray。还要提供您希望它去的行号、工作表名称和电子表格对象。

function insertRowAndCopyDataIntoIt(rownumber,rowArray,sheetname,spreadsheet) {
  var ss=spreadsheet;
  var sh=ss.getSheetByName(sheetname);
  sh.insertRowBefore(rownumber);
  sh.getRange(rownumber,1,1,rowArray.length).setValues([rowArray]);  
}

作为替代方案,您可以提供当前功能,我会为您修复它。

我测试了这个版本。它不会逐行执行。取而代之的是,它将已经存在的所有内容放入数组中,然后使用 unshift() 方法将新项目添加到数组的开头,并在最后执行 setValues() 从而完成相同的事情,但使用更少的 i /o 写入,因此速度更快。

function myFunction() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheet=ss.getSheetByName('OB BAT Emails');
  var label=GmailApp.getUserLabelByName("OB");
  var lr=sheet.getLastRow();
  if(lr>0) {
    var msgA=sheet.getRange(1,1,sheet.getLastRow(),1).getValues();
  }else{
    var msgA=[];
  }
  var threads=label.getThreads();
  for (var i=0;i<threads.length;i++) {
    var messages=threads[i].getMessages();
    for (var j=0;j<messages.length;j++) {
      if (messages[j].isUnread()) {
        var msg=messages[j].getBody();  
        msgA.unshift([msg]);
        messages[j].markRead();
      }
    }
    threads[i].removeLabel(label);
  }
  sheet.getRange(1,1,msgA.length,msgA[0].length).setValues(msgA);
}

此函数首先查看工作表上是否有任何数据。如果存在则所有消息都放入 msgA。当脚本找到更多符合您的条件的消息时,会将它们添加到 msgA 的开头。最后,该函数将工作表上的所有数据替换为 msgA 中的数据,从而向下移动旧数据并将最新消息留在顶部。

需要更多列...这里有八个:

function myFunction() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheet=ss.getSheetByName('OB BAT Emails');
  var label=GmailApp.getUserLabelByName("Q0/TEST");
  var lr=sheet.getLastRow();
  if(lr>0) {
    var msgA=sheet.getRange(1,1,sheet.getLastRow(),8).getValues();
  }else{
    var msgA=[];
  }
  var threads=label.getThreads();
  for (var i=0;i<threads.length;i++) {
    var messages=threads[i].getMessages();
    for (var j=0;j<messages.length;j++) {
      if (messages[j].isUnread()) {
        var msg=['','','','','','','',''];
        msg[0]=messages[j].getPlainBody().slice(0,49999);;
        msgA.unshift(msg);
        messages[j].markRead();
      }
    }
    threads[i].removeLabel(label);
  }
  sheet.getRange(1,1,msgA.length,msgA[0].length).setValues(msgA);
}

推荐阅读