首页 > 解决方案 > 需要脚本来遍历股票代码列表、复制结果输出并将输出粘贴到工作簿中的单独工作表

问题描述

如果有人可以帮助我创建以下 Google 表格脚本,我将不胜感激:

我在一个工作簿中有三张名为tickers,data的工作表。results

b9目前,我在工作表的单元格中手动输入股票代码data。然后该表检索数据(大约需要 30 秒从谷歌金融检索数据、运行公式并将数据返回到F2:AU2同一数据表中的范围内。

请求:创建一个脚本,loop通过工作ticker表(范围B2:B40)中的 40 个股票代码列表,一次将 1 个符号粘贴到工作表b9中的单元格中data,等待 google Finance API 运行,然后copy在范围内生成结果F2:AU2,然后粘贴将这些结果放入results选项卡中,一次 1 行,直到生成 40 行数据以与前面提到的 40 个股票代码列表相对应。

谁能帮我解决这个请求?我会非常感激。

标签: javascriptloopsgoogle-apps-scriptgoogle-sheets

解决方案


此代码在“帮助”菜单旁边添加了一个名为“更新股票”的菜单项,该菜单项提供触发器以运行脚本并清除除标题行(第 1 行)之外的结果选项卡的所有行。我还在“结果选项卡”中添加了“代码”和“运行日期”列。让我知道这是否是您正在寻找的。

/** @OnlyCurrentDoc */

function onOpen() {
  let ui = SpreadsheetApp.getUi();
  ui.createMenu('Stocks')
    .addItem('UPDATE STOCKS', 'getNewPrices')
    .addItem('Clear Data','clearData')
    .addToUi();
};

function getNewPrices() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const tickerSheet = ss.getSheetByName('tickers');
  const dataSheet = ss.getSheetByName('data');
  const resultsSheet = ss.getSheetByName('results');
  let data;


  let myListOfTickers = tickerSheet.getRange('B2:B40').getValues().filter(String).sort();

  myListOfTickers.forEach(ticker => {
    dataSheet.getRange('B9').setValue(ticker[0]);
    data = dataSheet.getRange('F2:AU2').getValues()[0];
    pasteData(resultsSheet, data, ticker);
  });
};

function pasteData(resultsSheet,data, ticker){
  let nextRow = resultsSheet.getLastRow() + 1;

  ////////////////////////////////////////////////
  //
  //  set timezone to your timezone
  //  https://gist.github.com/diogocapela/12c6617fc87607d11fd62d2a4f42b02a
  //
  ////////////////////////////////////////////////
  let timeZone = "America/New_York";
  //let timeZone = "America/Detroit";
  //let timeZone = "America/Chicago";
  //let timeZone = "America/Denver";
  //let timeZone = "America/Los_Angeles";

  resultsSheet.getRange(nextRow,1).setValue(ticker);
  resultsSheet.getRange(nextRow,2).setValue(Utilities.formatDate(new Date(),timeZone,"MM/dd/yyy"));

  data.forEach((datum,index) => {
    resultsSheet.getRange(nextRow,index + 3,1,1).setValue(datum);
  });
};

function clearData(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const resultsSheet = ss.getSheetByName('results');
  const range = resultsSheet.getRange(2,1,resultsSheet.getLastRow(),resultsSheet.getLastColumn());
  range.clearContent();
}

推荐阅读