【问题标题】:Using getThreads code not working in GAS使用 getThreads 代码在 GAS 中不起作用
【发布时间】:2017-03-02 21:33:03
【问题描述】:

我运行这段代码,它什么也没做。没有错误,没有输出。任何帮助将不胜感激!

我已尝试更改所有内容...范围、工作表名称、appendRow 与 setValues。我已经为启动和最大线程添加了 0,10,删除了第一个 for 循环......到目前为止没有任何效果。

function myFunction() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var sheet = ss.getSheetByName("NewEmails"); 
  var range = sheet.getRange(1,1,25,25);


  //.appendRow("this function works a little");

  var threads = GmailApp.getInboxThreads(0,10); // get first thread in inbox
  //var message = thread.getMessages()[0]; // get first message

  //var threads = label.getThreads();

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

    for (var j=0; j<10; j++) //messages.length
    {

      var dat = messages[j].getDate();
      var sndr = messages[j].getFrom();
      var rcpnt = messages[j].getTo();
      var sub = messages[j].getSubject();
      var msg = messages[j].getBody();

      var target = [dat,sndr,rcpnt,msg, sub, dat];

      sheet.getRange(1,1,25,25).setValues(target);

      //.appendRow([dat,sndr,rcpnt,msg, sub, dat]); DOES NOT WORK FOR SOME REASON BUT IS PREFERED METHOD
    }
      //threads[i].removeLabel(label);
  }
}

【问题讨论】:

  • 目标必须是二维数组。 setValues() 采用二维数组。每个内部数组代表一行。每个内部数组的每个元素代表一个单独的单元格。 var outerArray = []; outerArray.push(target); sheet.getRange(1,1,outerArray.length,target.length).setValues(outerArray);如果您不熟悉故障排除工具,请阅读troubleshooting guide
  • 是的,我意识到 setValues() 和 setValue() 有很大的不同。这两个可以与范围一起使用。 appendRow() 必须在工作表级别使用。

标签: javascript google-apps-script gmail


【解决方案1】:

我以前从来没有玩过这个,但我终于让它工作了。

function onOpen()
{
  SpreadsheetApp.getUi().createMenu('My Tools')
    .addItem('Get My Messages', 'MyMessages')
    .addToUi();
}

function MyMessages()
{  
  var threads = GmailApp.getInboxThreads();
  var s = '';
  for(var i = 0; i < threads.length; i++) 
  {
    var msg = threads[i].getMessages();
    for(var j = 0; j < msg.length;j++)
    {
      s += 'Message' + j+1 + '<br />';
      s += msg[j].getFrom() + '<br />';
      s += msg[j].getBody() + '<br />';

    }

  }
  dispStatus('My Messages', s , 800 , 400);  
}

function dispStatus(title,html,width,height)
{
  var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
  var width = typeof(width) !== 'undefined' ? width : 800;
  var height = typeof(height) !== 'undefined' ? height : 400;
  var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
  var htmlOutput = HtmlService
     .createHtmlOutput(html)
     .setWidth(width)
     .setHeight(height);
 SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
} 

我没有尝试将其放入电子表格中,但我想这留给读者作为练习。但是请记住,当您在范围内使用 setValues 时,源的大小必须等于目标的大小,而在我看来,它们并不相同。

var target = [dat,sndr,rcpnt,msg, sub, dat];
sheet.getRange(1,1,25,25).setValues(target);

目标是 1 行乘 5 列,而您的目标是 25 x 25,所以我猜这不会飞。在 html 对话框中显示它们的另一个优点是它们已经是 html 格式。

【讨论】:

  • 天啊!你是最棒的。我一直在使用类似的脚本,只是弄清楚了电子表格的发布,但其余的却没有。让我测试一下这个脚本,但我相信你甚至解决了其他一些问题!!!
  • 附带问题:既然您似乎对创建用户界面了解得更多...您知道我是否将我的脚本转换成这样的用户界面,如果它们运行得更快而不是使用谷歌表格?
  • 我真的不知道。但我的猜测是,如果您最大限度地利用客户端(html 对话框和侧边栏)并在服务器端获得最大优势,那么我猜服务器总是会赢。话虽如此,我发现在单个电子表格中设置值非常耗时,而不是使用 setValues 并给它一个数组。这是我第一次弄乱 GmailApp,所以我想对我来说最好的答案是不知道。
  • 感谢您的 cmets。我不是专家,但我期待着类似的东西。
【解决方案2】:

对这段代码有帮助的一点是,我意识到 setValues() 和 setValue() 有很大的不同。这两个可以与范围一起使用。 appendRow() 必须在工作表级别使用。

你可以说:sheet.appendRow() 但不是 range.appendRow()。希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多