google-apps-script - 如何让自动添加的行显示在 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);
}
}
老实说,我不明白这是在做什么,但我已经从这里的其他答案拼凑起来,它似乎做了我想做的事,所以我会接受它。
解决方案
你说: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);
}
推荐阅读
- python - 使用命令的 Django 项目设置问题:django-admin startproject xxxxxx
- r - 如何在保持R中另一列的顺序的同时对列进行排序?
- python - 如何对每列中的所有值求和并将每列除以求和值
- azure-devops - 如果自定义条件评估为 false,则发布管道作业失败
- php - 在 php 函数中包含 css 内容
- swift - 为什么当我单击 Xcode Swift 项目中的单选按钮时没有调用我的选择器函数
- scala - 创建使用 extractCredentials 指令的自定义指令 - 值映射不是调用 extractCredentials 的成员
- spotfire-analyst - 如何在 Spotfire 中将整数 20200224 更改为 2020 年 2 月 24 日(表达式?)
- prometheus - Grafana 显示的是过去 3 天的指标,而不是整月
- grails - Grails:无法删除或更新父行:外键约束失败