当前位置: 首页 > 知识库问答 >
问题:

在同一电子表格中的多个工作表上运行基于时间的脚本

欧阳学真
2023-03-14

我是天然气新手,我写了一个脚本来进行价格比较,它基本上得到产品的价格,储存它们,每天通过基于时间的触发器检查价格是否发生变化,如果价格发生变化,发送电子邮件,如果没有变化,什么也不做。

所以现在我陷入困境,我想在电子表格中添加更多的工作表,我需要在所有工作表中运行相同的脚本,但我不知道如何管理它。

据我所知,现在我的脚本是基于这个功能运行的

“var ss=SpreadsheetApp.getActiveSpreadsheet();”,脚本know wich是活动的电子表格,如果我配置了基于时间的触发器,它就像一个符咒一样工作,但只适用于第一个工作表。我正在寻找一种方法,使用基于时间的触发器运行脚本,该脚本在所有工作表中运行

如何判断脚本是否为活动工作表,当我处理打开的文档时,是否为活动工作表是很清楚的,但我不知道如何在脚本运行时设置活动工作表。

我已经阅读了一些文档,一些人建议运行一个循环,检查电子表格中的所有工作表,获取名称或id,并在所有这些工作表中运行脚本。几周前,我刚刚开始使用javascript和Gas,我一直在使用它,但我没能让它正常工作

我发现有些人想做类似的事情,但我真的不知道代码的所有功能,

这里是我在这里找到的循环的一些例子,我希望这个代码得到工作表的名称并执行一个函数,但我不是舒尔。

  function CheckSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  for(var k=0;k<sheets.length;k++) {  
   excute function checkprice???
   }

这是我的脚本,我不知道我找到的例子是否适合我的情况

function CheckPrice() {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var source1 = ss.getRange("A27:A145");
var source2 = ss.getRange("B27:B145");
var source3 = ss.getRange("A28:A145").getValues();
var source4 = ss.getRange("E28:E145").getValues();
var source5 = ss.getRange("E27:E145");
var source6 = ss.getRange("A28:A145");




if (source6.isBlank()) {

Browser.msgBox('WAITING FOR DATA !', Browser.Buttons.OK); 
Utilities.sleep(30000);

}


if (source5.isBlank()) {

source1.copyTo(ss.getRange("E27:E145"), {contentsOnly: true});
source2.copyTo(ss.getRange("F27:F145"), {contentsOnly: true});
Browser.msgBox('VALUES COPIED !', Browser.Buttons.OK);
}

  var Inspector = false;
 for(var i=0;i<source3.length;i++)
  {
  if(source3[i][0].toString() !=  source4[i][0].toString())
  {
 Inspector = true;
 }
}

if(Inspector)
{

 MailApp.sendEmail("oker82@gmail.",ss.getSheetName() + " HAS ", ss.getSheetName() + " CHANGED " );

 }
 else
 {
 Browser.msgBox('NOTHING CHANGES !', Browser.Buttons.OK);
 }
 }

共有1个答案

贾实
2023-03-14

这是未经测试的,但我认为它符合您的要求。

function CheckSheets(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  for(var k=0;k<sheets.length;k++) {  
    CheckPrice(sheets[k].getName());
   }
 }

function CheckPrice(sheetName){

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName);
var source1 = sheet.getRange("A27:A145");
var source2 = sheet.getRange("B27:B145");
var source3 = sheet.getRange("A28:A145").getValues();
var source4 = sheet.getRange("E28:E145").getValues();
var source5 = sheet.getRange("E27:E145");
var source6 = sheet.getRange("A28:A145");




if (source6.isBlank()) {

Browser.msgBox('WAITING FOR DATA !', Browser.Buttons.OK); 
Utilities.sleep(30000);

}


if (source5.isBlank()) {

source1.copyTo(sheet.getRange("E27:E145"), {contentsOnly: true});
source2.copyTo(sheet.getRange("F27:F145"), {contentsOnly: true});
Browser.msgBox('VALUES COPIED !', Browser.Buttons.OK);
}

  var Inspector = false;
 for(var i=0;i<source3.length;i++)
  {
  if(source3[i][0].toString() !=  source4[i][0].toString())
  {
 Inspector = true;
 }
}
}
 类似资料:
  • 我有以下脚本。 我有一个电子表格,有10个工作表和15个用户登录并修改它。 在特定列中插入activesheet中两天之间的天数,脚本比较第J列中的日期和今天,并在第F列中插入差值。 我不能使用定时触发器运行此脚本。我想为并发工作表每15分钟运行一次这个脚本。 只有在电子表格中只有一张工作表时,触发器才会定时运行。如果我有多张工作表,则触发器不会随时间运行。如果我将同一个触发器设置为OneEdit

  • 我有一个用于Google Sheets的“onEdit”脚本,但只希望它在一张工作表上工作: 如何更改脚本,使其仅在工作表中的一张工作表上工作?

  • 首先,我创建了一个基于时间的触发器,每天在凌晨1点到2点之间运行。我需要这个触发器来每次跨多个工作表运行一个函数,而不需要创建额外的函数。我想我已经基本上弄清楚了,但是我在没有运行触发器的情况下测试它,然后等到第二天看它是否工作时遇到了问题。有没有一种方法可以测试触发器,而不必为我所做的每一个更改等待24小时? 其次,当我点击run on时,它似乎没有运行我在函数运行期间需要运行的函数,即。我知道

  • 我有一个谷歌电子表格,有两张叫做罗宾和露西的表格。每次我向列A添加一些数据时,我都制作/找到/破坏了一个脚本来对工作表上的数据进行排序 这个剧本很棒,但我只想把它应用在第一张纸上,罗宾。第二个工作表中的数据,Lucy,是不一样的,所以我将创建另一个脚本为不同的范围,一旦我得到了这个问题的头脑。 我想我需要使用getSheetByName(“罗宾”),但我似乎无法让它工作。提前感谢

  • 我是一名编码等方面的初学者,但我正在努力理解我在做什么以及代码中发生了什么。 我想在不同的电子表格之间划一行。 我在“核心”电子表格中有一个脚本,它在“主页”和“完成”表格链接之间移动一行到电子表格: 我搜索了如何将位于“已完成”工作表上的数据移动到另一个名为“数据库”的电子表格链接到电子表格: 但我想将数据从表“CORE”/“Finished”传输到表“database”/“DB”,而不重写DB

  • 我有3个电子表格来存储登录/注销表的数据。签到/退出表(表1)、时间跟踪器表(表2)和镜像表(表3)。镜像表用于比较新列表和旧列表。我想解决的问题是使代码不在表1中。我想把它写在第二张纸上,但问题是这张纸上有所有的触发器,而内容是第1张纸。但因为这是人们将要使用的,我不希望他们能够找到代码并弄乱它,所以我希望sheet2能够用代码控制一切。以下是我认为与此问题相关的代码部分。当它出现在表1上时,它