0 基础学脚本:给同事做一个排班表并每日通知「02」

news2024/11/8 6:29:00

Hello 小伙伴们早上、中午、下午、晚上、深夜好!

我是爱折腾的 jsliang~

本系列文章和配套直播视频,面向金山文档的「轻维表」「表单」用户。

希望通过【自动化】和【脚本】等能力,让里面数据相互流转起来,从而提升工作效率。

本篇文章为系列第 2 篇,将介绍下面内容:

  1. 定义一个数据。letconst 区别是什么

  2. 数据类型。字符串(String)、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object

  3. 接口请求。GETPOST 请求区别是什么

当然,本篇干货将会有 “亿点点” 多~

上面知识点只是前一篇文章的回顾,我们还需要学习:

  1. 数据遍历。如何通过 for 取到表中每一条信息

  2. 日期判断。如何通过 if...else if...else... 判断只发送当天时间对应的信息

这 5 个知识点,我们将在下面内容反复展示用法,让小伙伴们通过一个又一个的实例巩固起来,达到随手就可以写脚本的目的。

本篇文章将进行每日发送:

5cabee1ed59ea94ad1f86aea3ecb4b05.jpeg

  • 如果对你有帮助 欢迎点赞和关注

  • 如果对内容有感 欢迎评论和私聊

  • 如果要介绍对象 欢迎扫码加微信

76649137f0049170ca0dcd12f14d19ad.jpeg

WX: Liang123Gogo

糟糕!哪怕上篇文章被投诉了,这篇文章还是写完了,这个作者他真的试图教会你们~

他真的,我哭死!

7f17af3e602b7d58eb874fcb9b78b644.png

上篇文章感谢【超燕】小伙伴的赞赏!

一、代码是怎么运转起来的

还记得上一篇文章我们的那 28 行代码么?

它是如何运转起来的,我们如何能手刃代码,成为独当一面的「脚本小能手」,让我们开始整起来吧~

在这之前,让我们创建一个「轻维表」并运行一段简单的脚本,开始我们的 Hello World 之旅:

打开 https://www.kdocs.cn/ ,登录后按步骤操作:

Step 1:创建文件

8f831698edea7f0539e8be0c7d9fa596.jpeg

Step 2:了解「轻维表」能力

6eb146b85c7ac0dbba3382c1b67f2c81.jpeg

Step 3:管理脚本并创建脚本

d6756cb025a43b5d19b08a2cda96673c.jpeg

0626b571e656f0e159b816abaf6acca0.jpeg

Step 4:脚本界面介绍

aba9be4cebaa127e26274c90d93e2a2d.jpeg

Step 5:运行一段脚本

复制脚本并按照下面图片流程操作:

console.log('你好金山文档的 jsliang');

9befe1dc7998585285b8e1236f7ed5da.jpeg

哦豁,欢迎来到【编程】世界,你敲下了人生的第一种语言的 Hello World

这里的 console.log,就是打印【信息】,下面我们会看到很多打印,你可以快速了解它的能力

1.1 定义数据

// 这里取的是第 2 行的数据(即我们填写的第 1 条数据)
const 第一条数据 = Application.Sheets.Item(1).Rows(2);

好,话不多说,让我开始哆嗦起来~

先看这 2 行代码,它们是怎样子的。


知识点 1:注释

通过 // 注释内容,我们给第 2 行做了代码注释,告诉看这行代码的小伙伴,下面这个这行代码的作用是啥。

JavaScript 有多种注释方式:

// 注释内容
/* 注释内容 */

你并不需要太过于在意别人怎么写注释~

你需要明白的是,如果你的代码是会分享给别人的。

那么!一些比较绕的地方,千万记得注释,要不然别人不想看你代码也很正常。


知识点 2:变量

通过 const,我们定义了一个变量。

什么是变量,为什么要定义,这个引用数学中的一个经典:

// 很明显这个 `x` 的值为 `2`
2x = 4

在数学中,我们把这里的 x 叫做 “未知数”。

而在 JavaScript 代码上,我们这么定义:

const x = 4 / 2;

这里的 x,我们叫做变量,而 const,是定义变量的一种方式。

在 JavaScript 中,我们有 2 种定义变量的方式:

// 通过 let 定义的变量,是可以 “变” 更的
// 下面我的存款,就是可以动态变化的
let 我的存款 = 1000;
我的存款 = 10000;
console.log('我的存款: ', 我的存款);

// 通过 const 定义的,我们可以称之为 “常” 量
// 即这个字段,一般情况下是不可以变的
// 当然,下一小节有几个特殊家伙,他们可以变一些 “东西”
// 这里我们先忽略,认定 “常” 量
const 我的性别 = '男';
console.log('我的性别: ', 我的性别);

将这几行代码丢到我们脚本运行:

d136615acfbe743f3a0908ab4e19d11e.jpeg

当然,实际上有 3 种,还有一种定义方式是 var

但是!jsliang 不推荐你们使用 var!!

所以你们看到这个关键字,知道它是定义变量的即可,千万不要在你的代码中使用。


知识点 3:其他

最后,这里的 Application.Sheets.Item(1).Rows(2) 是什么意思呢?

就不得不提到下一小节的 “对象” 了。

你们经常听的程序员 new 一个对象,要来咯~

1.2 读取表信息

现在,打开 jsliang 为这次精心准备的教学文档:

  • 0 基础学脚本:给同事做一个排班表并每日通知「02」https://kdocs.cn/l/cpPbvz32LSxB

3b5741ba46b02dfbffcae40c1546e2e6.jpeg

然后,我们顺手就 pia 一下新建好一个脚本并跑起来:

// 所谓 Application,我们可以看做是「轻维表」这个应用
// 然后 .Sheet 即查询里面的所有「表」
// 最后 .GetSheets() 即获取所有「表」的信息
// 参考文档: https://kdocs.cn/l/ctzsgDlAGF0l?linkname=ijRISSgUJ8
// 这些功能,我们会在下一篇文章的【方法-Function】中介绍
// 这里我们只需要知道有这个功能即可(后面会介绍!)
const 所有表 = Application.Sheet.GetSheets();

// 这里我们定义了一个【数组】,用来获取信息
// 数组即变量的一种,下一小节我们会详细介绍
const 所有表信息 = [];

// 这里我们对上面取到的数组进行了遍历
// 数据遍历通过 `for (let 自增变量; 自增变量 < 总遍历次数; 自增变量自增)` 的形式操作
// 同样,下面小节我们会详细介绍遍历
for (let i = 0; i < 所有表.length; i++) {
  const 单张表 = 所有表[i];
  所有表信息.push({
    名称: 单张表.name,
    id: 单张表.id
  });
}
console.log('所有表信息: ', 所有表信息);

运行代码:

d5af401e4bd7321be7b61d98012ba4d9.jpeg

哦豁,我们在上面图片,好像发现一些不得了的信息:

[
  { "名称": "全字段", "id": 3 },
  { "名称": "典型字段", "id": 4 },
  { "名称": "排班表", "id": 6 }
]

是的!我们把这个文档里面的 3 张表信息打印出来了~

PS:这里的【方法】【数组】【遍历】,我们会在下面一一介绍,这里运行这个代码,单纯是为了获取表的信息!

1.3 数据类型

OK,通过上面代码,我们知道了:

  • { "名称": "典型字段", "id": 4 }

那么,很巧的是,我这里有一段代码,可以根据这个信息,获取到这张表的数据:

// 这里的数据,是从【02-读取所有表信息】这个脚本取的
const 典型字段表 = { "名称": "典型字段", "id": 4 };

// 参考文献:https://kdocs.cn/l/ctzsgDlAGF0l?linkname=PpHAGnTCor
// 通过 “已知” 的表 ID,我们获取到这张表的数据
const 典型字段表的数据 = Application.Record.GetRecords({ SheetId: 典型字段表.id });
console.log('典型字段表的数据: ', 典型字段表的数据);

// 因为【运行日志】显示不齐全了
// 所以我们需要发送全部信息到企业微信,再拷贝到控制台查看
const 发送的信息 = JSON.stringify(典型字段表的数据);

// 这里的是发送的机器人地址,通过企业微信的【群机器人】可以创建并获取到地址
// 下面代码请填写你们机器人的地址
const 机器人地址 = '请填写自己机器人的 Webhook 地址';

// 这里是发起网络请求,我们记住网络请求一般有 GET 和 POST 即可
HTTP.fetch(机器人地址, {
  method: "POST",
  body: JSON.stringify({
    "msgtype": "markdown",
    "markdown": {
      "content": 发送的信息
    }
  }),
});

Step 1:复制粘贴并运行代码

ce31d48fa264f745c74795d10fc5f728.jpeg

Step 2:查看发送到企微群的信息

a803b10e90f0c64c0d157e73d86e8d69.jpeg

Step 3:通过 Chrome 的【F12】按钮,打开控制台;或者按照下面步骤,打开控制台,并输入内容

6f0a6801bf004e7a16dd11938e0d496e.jpeg

OK,我们开始看看这些信息:

{
  字符串: "字符串",
  数字: 1000,
  布尔值: true,
  数组: [
    {
      avatar:
        "https://img.qwps.cn/284255574?imageMogr2/thumbnail/180x180!&k=1634523681455645311",
      id: "284255574",
      nickName: "jsliang",
    },
    {
      avatar:
        "https://img.qwps.cn/FqDIiaoitPv-S5HYsL70OhSxa3LF?imageMogr2/thumbnail/180x180!",
      id: "341699977",
      nickName: "CGGC",
    },
  ],
  对象: {
    detail: "金山软件园",
    districts: ["广东省", "珠海市", "香洲区"],
  },
}

在 JavaScript 中,我们有【字符串】【数字】【布尔值】【数组】【对象】等多种数据类型,下面我们逐个了解吧!


知识点 1:字符串

所谓字符串,就是我们平时说的 “文本”,我们平时在各种聊天输入框说的话,在计算机上存储起来的,就是 “字符串”。

这个字符串,在 JavaScript 中,一般通过双引号 "字符串",或者单引号 '字符串' 的形式包裹起来。

比如我们定义一段文本:

const 对前任的话 = '此时此刻此歌又想起你,可恶总感觉自己跟舔狗一样,被甩了也念念不忘';

当然,我们还可以对它 “拼接”,正如上一篇文章那样做的一样:

const 姓名 = '梁峻荣';
const 年龄 = 28;
const 爱好 = '吃喝玩乐';

// 通过 '字符串' + '字符串',我们可以把多个字符串拼接起来
// 这里的效果是:
// 梁峻荣28吃喝玩乐
const 拼接的信息1 = 姓名 + 年龄 + 爱好;
console.log('拼接的信息 1: ', 拼接的信息1);

// 这里的效果是:
// 你好,我叫梁峻荣,今年28。我喜欢吃喝玩乐
const 拼接的信息2 = '你好,我叫' + 姓名 + ',今年' + 年龄 + '。我喜欢' + 爱好;
console.log('拼接的信息 2: ', 拼接的信息2);

知识点 2:数字

数字,这个大家都不会陌生。

我们在「轻维表」中存储的数据,很多都是数字类型的,例如:

  • 数值

  • 百分比

  • 等级

  • 编号

  • 货币

  • 进度

而说到数字,我们需要了解简单的 5 则运算:

1、加法:通过 + 进行运算

// 加法
const 和 = 2 + 4;
// 通过【变量 A + 变量 B】,我们可以求和
// 下面输出是【和: 6】
console.log('和: ', 和);

// 自增数字
let 自增值 = 10;
const 自增和 = 自增值++;
// 通过【变量++】,我们可以让它自增 1
// 下面输出是【自增和: 11 10】
// 即【自增值++】相当于【自增值 + 1】
console.log('自增和: ', 自增值, 自增和);

2、减法:通过 - 进行运算

// 减法
const 我当前有的钱 = 10000;
const 月租 = 900;
const 我剩余的钱 = 我当前有的钱 - 月租;
// 通过【变量 A - 变量 B】,我们可以求差值
// 下面输出是【我剩余的钱: 9100】
console.log('我剩余的钱: ', 我剩余的钱);

// 自减数字
let 自减值 = 10;
const 自减差 = 自减值--;
// 通过【自减值--】,我们可以让它自减 1
// 下面输出是【自减差: 9 10】
// 即【自减值--】相当于【自减值 - 1】
console.log('自减差: ', 自减值, 自减差);

3、乘法:通过 * 进行运算

const 乘数1 = 3;
const 乘数2 = 3;
const 乘积 = 乘数1 * 乘数2;
// 打印信息【乘积: 9】
console.log('乘积: ', 乘积);

4、除法:通过 / 进行运算

const 除数 = 9;
const 被除数 = 3;
const 结果 = 除数 / 被除数;
// 打印信息【结果: 3】
console.log('结果: ', 结果);

5、求余:通过 % 进行运算

const 数值 = 10;
const 求余 = 3;
const 结果 = 数值 % 求余;

// 打印信息【结果: 1】
// 这里的计算,即 10 / 3,得 3,余 1,这里的 1 即余值
console.log('结果: ', 结果);

当然,我们脚本还有更高级的数字计算方法,比如:

  • 平方:Math.pow(2, 3)(结果为 8

  • 绝对值:Math.abs(-10)(结果为 10

  • 四舍五入:Math.ceil(4.5)(结果为 5

这里我们不一一列举,更多的小伙伴们可自行查看:

  • Math 函数:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math

需要注意的是,我们四则运算是符合数学的四则运算的,所以碰到先乘除后加减的场景,记得加上括号 ()

console.log('平方: ', Math.pow(2, 3));
console.log('绝对值: ', Math.abs(-10));
console.log('四舍五入: ', Math.ceil(4.5));

// 四则运算
const 求值 = (2 + 2) * 2 / 2;
// 这里输出【4】
console.log('求值: ', 求值);

记住,脚本光看不敲不练,你永远也学不会

所以,最好的练习,是将上面的代码都敲一遍,这样你才能学会!!


知识点 3:布尔值

所谓布尔值,非【真】即【假】~

即它只有 2 种状态:

  • true:真

  • false:假

{
  布尔值: true,
}

我们在进行【是否】判断的时候,需要用到布尔值:

const 空字符串 = '';
// 这里通过 !! 可以将一个值转换为布尔值
// 空字符串对应的是 false
console.log('空字符串: ', !!空字符串);

const 有值的字符串 = 'jsliang';
// 有值的字符串对应的是 true
console.log('有值的字符串: ', !!有值的字符串);

const 数字0 = 0;
const 数字1 = 1;
// 打印的值【数字: false true】
// 这里需要明白的是,一个数字小于等于 0,输出 false
// 一个数字大于 0,输出 true
console.log('数字: ', !!数字0, !!数字1);

// 下面是一个 if...else if...else... 判断,用来判断一种情况
const 你的名字 = 'jsliang';
// 这里的意思是,【你的名字】这个变量,是否等于【梁峻荣】
// 很明显是错误的
if (你的名字 === '梁峻荣') {
  console.log('输出 1');

  // 下面的意思是,上面条件不满足的时候
  // 再判断【你的名字】这个变量,是否等于【jsliang】
  // 很明显是对的
  // 所以输出【输出 2】
} else if (你的名字 === 'jsliang') {
  console.log('输出 2');
} else {
  console.log('输出 3');
}

这里的 if...else if...else... 判断,我们在下面还会用到!


知识点 4:数组

了解完上面几种基础类型后,我们要开始出招了,【数组】和【对象】怎么一回事呢?

在脚本,即 JavaScript 中,有 2 种数据区分方式:

  • 基础数据类型(引值):字符串、数字、布尔值

  • 引用数据类型(引址):数组、对象

这就好比你买了一块地皮:

所谓 基础数据类型(引值),就是计算机分配给它一个固定的位置,用来存放这个值,它销毁了就直接销毁了。

这里面的【字符串】【数字】【布尔值】,就好比你购买的家居、你存放的纸质人民币,他们是固定的实体的。

你可以在这块地皮上面,建一套房子。

这套房子上随意挪动你的家居和纸质人民币,这并不影响他们的性质。

而这块地皮,就像【数组】和【对象】,它是计算机分配的一块固定位置的内存,它建了房子,它的房间还蛮大的,你可以用它来存放各种 基础数据类型

b589c60c19c8b28c6e720d47d5409084.jpeg

让我们快速了解下数组:

// 下面的数组存放了字符串、数字和布尔值
// 我们通过 [] 的方式存放数组
const 数组1 = ['字符串', 12, true];

// 【填写数组数据】
// 计算机是 0101 二进制的,所以很多数据从 0 开始
// 数组也是从 0 开始
数组1[0] = 'jsliang';
// 这里的 1 是指第二个数字,即 12 -> 28
数组1[1] = 28;
// 这里的 数组1.length 是指数组的长度
// 很明显上面的数组,有 3 个字段,即长度为 3
// 所以【数组1[数组1.length - 1]】相当于【数组1[3 - 1]】,即【数组1[2]】
// 也就是我们的布尔值 true,这里修改为 false
数组1[数组1.length - 1] = false;
// 这里将一个字段推到数组里面了
// 我们知道数组是引址的
// 也就是分配的是一块地皮,你可以往里面再添加新东西
数组1.push('新的字符串');
// 这里输出【数组1: ["jsliang",28,false,"新的字符串"]】
console.log('数组1: ', 数组1);

// 下面的数组存放了字符串和对象
const 数组2 = [
  // 这里每个 {} 包裹的,都是 “一条数据”
  {
    // 对象里面也可以存放各种数据
    avatar: "https://img.qwps.cn/284255574?imageMogr2/thumbnail/180x180!&k=1634523681455645311",
    id: "284255574",
    nickName: "jsliang",
  },
  {
    avatar: "https://img.qwps.cn/FqDIiaoitPv-S5HYsL70OhSxa3LF?imageMogr2/thumbnail/180x180!",
    id: "341699977",
    nickName: "CGGC",
  },
];

// 【查询数组数据】通过 for 可以遍历数据
for (let i = 0; i < 数组2.length; i++) {
  const 本条数据 = 数组2[i];
  const 用户ID = 本条数据.id;
  const 昵称 = 本条数据.nickName;
  console.log('输出:', 用户ID, 昵称);
}
// 这里会打印 2 次
// 第 1 次:输出: 284255574 jsliang
// 第 2 次:输出: 341699977 CGGC

很好,通过这样操作,你会发现数组不过如此!

后续文章会用到数组的一些【方法-Function】或者一些对数组的操作,但是这里我们不需要有太多了解。

拼接 2 个数组

const 数组左侧 = [1, 2];
const 数组右侧 = [3, 4];
const 新数据 = [...数组左侧, ...数组右侧];
// 这里输出【新数据: [1,2,3,4]】
console.log('新数据: ', 新数据);

知识点 5:对象

加油!数据类型还差一个需要了解了:对象

回归开头:

// 这里取的是第 2 行的数据(即我们填写的第 1 条数据)
const 第一条数据 = Application.Sheets.Item(1).Rows(2);

我们不是说 Application.Sheets.Item(1).Rows(2) 是对象吗?其实它是这样的:

{
  "Application": {
    "Sheets": {
      "Item": Function
    }
  }
}

哎嘿,假设要在代码上表示:

  • 你的对象是白雪公主

// 这里定义了一个对象【你】
const 你 = {
  // 这里定义了对象【你】的对象是【白雪公主】
  // 这里的【对象】,可以不用 "" 括起来
  // 但是一般推荐你括起来(有时候你看到的数据是不括的)
  "对象": "白雪公主"
};

// 【修改值】这里定义了【你】的职业
你.职业 = '骑士';
// 【读取值】这里输出【你的职业: 骑士】
console.log('你的职业: ', 你.职业);

// 这里输出:【你的对象: 白雪公主】
console.log('你的对象: ', 你.对象);

这里我们有 4 点信息:

  1. 对象定义的方式是 {}

  2. 对象可以通过 "键名": "值" 这种键值对方式定义(比如 "对象": "白雪公主"

  3. 对象也可以通过 对象.属性 这种形式定义(比如 你.职业

  4. 通过 对象.属性 可以获取到这个属性的值

这里小伙伴们可能很不理解,为什么叫「键值对」:

7063a67fa1afef7e35e0405e01ad64e0.jpeg

这里我们可以拿键盘来举例:

const 键盘 = {
  "回车键": 13,
  "ESC 按键": 27,
};

哎~

说到这个你是不是可以快速理解「键值对」了,就是【按键】对应的【值】嘛~

那么我们再看开头打印的值:

对象: {
  detail: "金山软件园",
  districts: ["广东省", "珠海市", "香洲区"],
},

这里的对象,对象.detail 对应的就是【详细地址】,对象.districts 对应的就是【省市区】(我们用数组来表示【省市区】)

很赞,对象我们也了解了~

1.4 简单回顾

再回收前面我们在变量中说的话:

// 通过 const 定义的,我们可以称之为 “常” 量
// 即这个字段,一般情况下是不可以变的
// 当然,下一小节有几个特殊家伙,他们可以变一些 “东西”
// 这里我们先忽略,认定 “常” 量
const 我的性别 = '男';
console.log('我的性别: ', 我的性别);

在这里我们说过有几个特殊家伙,可以变,那就是【数组】和【对象】。

const 我的性别 = '男';
// 下面这行在脚本编辑器运行会报错
const 我的性别 = '女';

const 你 = {
  "性别": "男",
};
// 这里运行不会报错喔
你.性别 = '女';
console.log('你的性别: ', 你.性别);

好家伙,居然改变性别了~

当然,如果你仔细跟着上面代码敲过一遍,实际上你是可以理解:

  1. 【对象】和【数组】是引址,它是可变的

  2. 我将【对象】的内容变更,实际上还是在这块地址操作

  3. 所以,通过 const 定义这个对象【你】,就不能再次定义

  4. 但是,我可以反复修改对象【你】里面的所有数据

1.5 接口请求

很好,温习旧知识,我们就差最后一步了!

当你打开浏览器的任意一个网站,你会发送网络请求给他们,让他们给你返回信息。

这个【请求】,我们一般叫做【GET 请求】,它主要是用来获取信息的。

02dbda933164d69580d5aa219764ce5d.jpeg

2388471ab643129f047e4735990834ff.jpeg

既然 GET 请求是用来获取信息的,那么相对应的就是 POST 请求:

2925cc55f69ebd5dfef3fb8b2cd2a147.jpeg

e8bdfe196fbb70db00b2f2c275b2e281.jpeg

还记得我们前面发送企微信息的代码么:

// 这里的是发送的机器人地址,通过企业微信的【群机器人】可以创建并获取到地址
const 机器人地址 = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx';

// 这里是发起网络请求,我们记住网络请求一般有 GET 和 POST 即可
HTTP.fetch(机器人地址, {
  method: "POST",
  body: JSON.stringify({
    "msgtype": "markdown",
    "markdown": {
      "content": '发送的信息'
    }
  }),
});

看这里的 method,我们就是用的企微的 POST 接口请求!

当然,如果我们只是简单往【脚本】里面塞这段代码,并且修改【机器人地址】,我们是发不出去信息的

d2cad0879e60d2ad7a47198a71e300f3.jpeg

开通服务后,我们可以查看我们网络请求是否正常发出去了没有:

7aa35e015460d55eeea983c5aa12f92d.jpeg

当然,这里的截图,是【脚本】发出去的 POST 请求,非发送企微的 POST 请求,这里面的复杂点,我们就不一一介绍啦!

1.6 小结回顾

OK,通过上面内容,我们拿前一篇的代码回顾看看,我们还有什么不懂的:

// 这里取的是第 2 行的数据(即我们填写的第 1 条数据)
const 第一条数据 = Application.Sheets.Item(1).Rows(2);

// 这里取的是第 2 行第 n 列的数据,这里的 n 是指 Columns() 里面的数字
const 姓名 = 第一条数据.Columns(4).Text;
const 昵称 = 第一条数据.Columns(5).Text;
const 性别 = 第一条数据.Columns(6).Text;
const 兴趣爱好 = 第一条数据.Columns(7).Text;
const 其他介绍 = 第一条数据.Columns(8).Text;

// 这里的是发送的信息,我们用 Markdown 能力进行信息拼接
let 发送的信息 = 'Hello 小伙伴们好! \n';
发送的信息 += '今天入职的新人:「' + 姓名 + '」' + '(' + 性别 + ')\n';
发送的信息 += 'ta 的兴趣爱好:「' + 兴趣爱好 + '」' + 'ta 的更多介绍有:「' + 其他介绍 + '」\n';

// 这里的是发送的机器人地址,通过企业微信的【群机器人】可以创建并获取到地址
const 机器人地址 = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx';

// 这里是发起网络请求,我们记住网络请求一般有 GET 和 POST 即可
HTTP.fetch(机器人地址, {
  method: "POST",
  body: JSON.stringify({
    "msgtype": "markdown",
    "markdown": {
      "content": 发送的信息
    }
  }),
});

没有!完全没问题!

里面的信息 jsliang 都给你讲解了~

二、给同事做一个排班表

OK,没有问题,我们开始给同事做排班表啦!

我们在本篇示例教程文档中新增排版信息:

  • 0 基础学脚本:给同事做一个排班表并每日通知「02」https://kdocs.cn/l/cpPbvz32LSxB

c6b3367eea7c5a313458a1fd863755a1.jpeg

2.1 遍历数据

所谓遍历数据,我们举例遍历【数组】数据的方法来快速了解:

// 遍历,我们通过 for 操作,它的公式是:
/*
for (let 自增变量 = 0; 自增变量 < 总数据; 自增变量++) {
  const 单条数据 = 所有数据[自增变量]
}
*/
// 下面代码,我们的总量是 3,从 0 开始,即 0/1/2
for (let i = 0; i < 3; i++) {
  console.log(i);
}
// 所以上面会依次输出 0/1/2

// 下面代码,我们遍历数组,然后输出里面的值
const 我的信息 = ['梁峻荣', 28, true];
for (let i = 0; i < 我的信息.length; i++) {
  // 这里【我的信息[i]】,就是逐个读取数组的信息
  // 注意:数组是从 0 开始喔~
  // 依次输出【'梁峻荣'】【28】【true】
  console.log(我的信息[i]);
}

然后我们实操一下。

// 这里通过脚本自带能力,获取到所有表的信息
const 所有表 = Application.Sheet.GetSheets();

// 然后我们要对这些信息做筛选
const 所有表信息 = [];

// 这里我们定义一下排班表的 ID,因为下面我们要根据这个 ID 读取这张表的信息
let 排班表id;

// 遍历,我们通过 for 操作,它的公式是:
/*
for (let 自增变量 = 0; 自增变量 < 总数据; 自增变量++) {
  const 单条数据 = 所有数据[自增变量]
}
*/
// 在下面代码中,i 就是我们的自增遍历,然后【所有表.length】获取到了所有表这个数组的长度
// 然后我们要遍历这个所有表每条数据,而【所有数据[自增变量]】对应的就是单条数据
// 举例数组 [1, 2, 3],那么【单条数据】对应的就 1 、 2 以及 3
for (let i = 0; i < 所有表.length; i++) {

  // 这个【单张表】,返回的是一个对象 {}
  const 单张表 = 所有表[i];

  // 然后我们可以往数组里面添加一个对象,这个对象对应的,就是要收集的数据
  所有表信息.push({
    "名称": 单张表.name,
    "id": 单张表.id
  });

  // 这个 if,就是如果 A 是 B 的意思,如果【true】,就进来里面,否则不进来
  // 这个 ===,就是判断 2 个值是否相等,这里就是判断这张表的名称,是不是叫【排班表】
  // 如果是的话,我们就收集它的 ID
  if (单张表.name === '排班表') {
    排班表id = 单张表.id;
  }
}

// 打印信息【所有表信息: [{"名称":"全字段","id":3},{"名称":"典型字段","id":4},{"名称":"排班表","id":6}]】
console.log('所有表信息: ', 所有表信息);
// 打印信息【排班表id: 6】
console.log('排班表id: ', 排班表id);

哎嘿,这里是不是说到 if 判断了,下面我们顺带学习一下!

2.2 条件判断

条件判断,在 JavaScript 有多重方式,这里我们只需要了解一种即可:

  • if...else if...else...

它非常简单:

const 我的姓名 = 'jsliang';

// if 就是如果的意思,如果【我的姓名】为【jsliang】,那么就进大括号 {} 里面的脚本
if (我的姓名 === 'jsliang') {
  // 所以这里会输出【1】
  console.log('1');
}

const 我的年龄 = 28;
// 这里先判断【我的年龄】是否为 27
if (我的年龄 === 27) {
  console.log('2');

  // 上面的条件肯定是假的,所以继续判断 else if 这里,就是 “如果上面不成立,那么我们继续往下走”
} else if ((我的年龄 + 1) === 29) {
  // 显而易见 28 + 1 肯定是 29,所以进来这里
  console.log('3');
} else {
  // else 就是上面条件都不走,必定会走这里,然后输出 '4',这次不周这里
  console.log('4');
}
// 小结:上面代码输出 '3'

// 我写代码你来猜:这里代码会走到哪里?
const 我的金钱 = '1000';
if (我的金钱 === 1000) {
  console.log('5');
} else if ((我的金钱 + 1) === 1001) {
  console.log('6');

  // 注意,这个 else if 可以有多个喔
} else if (Number(我的金钱) === 1000) {
  console.log('7');
} else {
  console.log('8');
}
// 小结:上面代码输出 '7',注意这里
// 1、字符串 '1000' 和数字 1000 并不相等,所以 `if` 的判断不成立
// 2、字符串 '1000' + 1,结果是 '10001',字符串 + 数字,会用字符串拼接喔
// 3、Number(字符串),就是将字符串强制转换成数字,所以会变成 1000 === 1000,就成立了

哎嘿,是不是又掌握了一个知识点!

2.3 值班表脚本

很棒!我们可以写值班表脚本了,假设我们有下面的信息,以及希望通知的脚本:

值班信息:

5ae9cc48a5098e8aa09309f36f97f25c.jpeg

通知脚本信息:

2980fae41b083c0631bbf8a2fde3a7c1.jpeg

那么我们是不是可以直接写代码:

const 所有表 = Application.Sheet.GetSheets();
const 所有表信息 = [];
let 排班表id;
for (let i = 0; i < 所有表.length; i++) {
  const 单张表 = 所有表[i];
  所有表信息.push({
    "名称": 单张表.name,
    "id": 单张表.id
  });

  if (单张表.name === '排班表') {
    排班表id = 单张表.id;
  }
}

console.log('所有表信息: ', 所有表信息);
console.log('排班表id: ', 排班表id);

const 排班表信息 = Application.Record.GetRecords({ SheetId: 排班表id }).records;
console.log('排班表信息: ', 排班表信息);

// new Date() 可以获取时间,这个我们会在下一篇文章讲解
// 这里我们只需要知道可以通过下面代码,拼接出【今天的年月日时间】
const 时间 = new Date();
const 年 = 时间.getFullYear();
const 月 = String(时间.getMonth() + 1).padStart(2, '0');
const 日 = String(时间.getDate()).padStart(2, '0');
const 年月日 = 年 + '/' + 月 + '/' + 日;
console.log('年月日: ', 年月日);

let 本日值班信息;
for (let i = 0; i < 排班表信息.length; i++) {
  const 行信息 = 排班表信息[i].fields;
  const 本行日期 = 行信息.日期;
  console.log('本行日期: ', 本行日期);
  if (本行日期 === 年月日) {
    本日值班信息 = 行信息;
    break;
  }
}
console.log('本日值班信息: ', 本日值班信息);

if (本日值班信息) {
  const 值班人1 = 本日值班信息['值班人 1'];
  const 值班人2 = 本日值班信息['值班人 2'];
  let 发送的信息 = '📅 今日值班:' + '@' + 值班人1 + '、' + '@' + 值班人2 + '\n';
  发送的信息 += '💕 劳烦关注今日课程信息';

  // 这里的是发送的机器人地址,通过企业微信的【群机器人】可以创建并获取到地址
  const 机器人地址 = '这里改成你的机器人地址吧!';

  // 这里是发起网络请求,我们记住网络请求一般有 GET 和 POST 即可
  HTTP.fetch(机器人地址, {
    method: "POST",
    body: JSON.stringify({
      "msgtype": "markdown",
      "markdown": {
        "content": 发送的信息
      }
    }),
  });
}

很好,今天的作业:

  1. 认真阅读上面的代码,理解这里的脚本意思,并自己创建文件创建脚本尝试几遍

  2. 理解通透后,尝试不看上面代码,自己写一遍代码,看下是不是真的能写出来

然后,我们再通过「轻维表」的【自动化】能力,就可以设置每天 9:00 执行我们的脚本啦:

dfdbb0f219b4f8d92620d207446d7600.png

8fc5314fcbbcebf60670361ae8e03fcf.png

当然,【自动化】还没放量到的用户,可以联系 jsliang 开通,我的联系方式:

9d0fd75ac24cff2b90a470f6d4687359.jpeg

WX: Liang123Gogo

三、总结

这篇文章 jsliang 写完整个人都麻了。

真的麻了,写一会不得不活动下,要不然感觉心脏受不了

1、耗费时间约 5~6 个小时:

05f658f99d41342f3ae4f2c88a0c393a.jpeg

2、里面写了 17 个脚本(这些脚本在另存上面的分享文件,就可以拿来即用喔):

b67e489ba1ec977b4891f0a707a4ac36.jpeg

3、用了 22 张以上图片:

f6448ae2b0390a02e0fbb0c3022cadb8.jpeg

4、以及 1.9W + 字数:

9c04f8d0d7321a650fc0ce90af13db64.jpeg

所以,可以不爱,请别伤害~

能点一下广告的点点广告,能点赞的点点赞(赞赏不太敢奢求了,被白嫖麻了)

我们下一篇文章,将继续针对【方法-Function】,并举例一个实例,来讲解【脚本】和【自动化】能力。

OK,我们下期见~


不折腾的前端,和咸鱼有什么区别!

觉得文章不错的小伙伴欢迎点赞/点 Star。

如果小伙伴需要联系 jsliang

  • Github

  • 掘金

个人联系方式存放在 Github 首页,欢迎一起折腾~

争取打造自己成为一个充满探索欲,喜欢折腾,乐于扩展自己知识面的终身学习斜杠程序员。

jsliang 的文档库由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议 进行许可。
基于 https://github.com/LiangJunrong/document-library 上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/636154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业级信息系统开发讲课笔记4.10 配置国际化页面

文章目录 零、学习目标一、使用Thymeleaf配置国际化页面&#xff08;一&#xff09;创建Spring Boot项目 - ThymeleafI18N&#xff08;二&#xff09;编写多语言国际化配置文件1、在resources下创建i18n目录2、在i18n目录里创建login.properties3、在i18n目录里创建login_zh_CN…

Prompt 用法大全!让 ChatGPT 更智能的六种策略(下)

上两篇介绍了 Pormpt 用法大全中前四种策略&#xff0c;本篇继续讲解后两种策略。‍‍‍‍‍ 点燃创作灵感&#xff1a;Prompt 实践指南揭秘&#xff01;让 ChatGPT 更智能的六种策略&#xff08;上&#xff09; Prompt 用法大全&#xff01;让 ChatGPT 更智能的六种策略&#…

基于html+css的图展示122

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

docker 的网络模式

一、docker网络概述 1、docker网络实现的原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c; 同时Docker网桥是 每个容器的…

ISO21434 操作和维护(十)

目录 一、概述 二、目标 三、网络安全事件响应 3.1 输入 3.1.1 先决条件 3.1.2 进一步支持信息 3.2 要求和建议 3.3 输出 四、更新 4.1 输入 4.1.1 先决条件 4.1.2 进一步支持信息 4.2 要求和建议 4.3 输出 一、概述 本条款描述了对文件中的项目…

Mysql中explain的用法详解

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

企业级信息系统开发讲课笔记4.8 Spring Boot整合Redis

文章目录 零、学习目标一、Redis概述1、Redis简介2、Redis优点&#xff08;1&#xff09;存取速度快&#xff08;2&#xff09;数据类型丰富&#xff08;3&#xff09;操作具有原子性&#xff08;4&#xff09;提供多种功能 3、Redis官网与在线教程 二、使用Spring Boot 整合 R…

c++11 标准模板(STL)(std::ios_base)(二)

定义于头文件 <ios> class ios_base; 类 ios_base 是作为所有 I/O 流类的基类工作的多用途类。它维护数种数据&#xff1a; 1) 状态信息&#xff1a;流状态标志&#xff1b; 2) 控制信息&#xff1a;控制输入和输出序列格式化和感染的本地环境的标志&#xff1b; 3)…

音视频技术开发周刊 | 297

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 Geenee AR为品牌商和零售商提供虚拟试穿应用 这意味着Geenee AR的虚拟试穿解决方案能够与品牌商现有的销售渠道无缝集成。 谁说苹果掉队了&#xff1f;WWDC上只字未提AI&a…

macbook pro存储空间不足怎么办? MacBook Pro怎么优化或清理Mac磁盘空间?

MacBook Pro用久了之后都会堆积很多残留文件或缓存垃圾&#xff0c;久经之下MacBook Pro磁盘空间将会面临不够用的情况。 macbook pro存储空间不足怎么办&#xff1f;macbook pro笔记本中的存储空间不足&#xff0c;想要优化一下&#xff0c;该怎么优化呢&#xff1f; 这时候…

【电路】电路与电子技术基础 课堂笔记 第8章 负反馈放大电路

反馈放大电路有很多好处&#xff0c;可以增加放大电路的输入电阻&#xff0c;使输出电流京可能稳定&#xff0c;保证输出电压随负载变化波动较小&#xff0c;减小电路元件参数变化对电路性能的影响等。 反馈放大电路分为正反馈和负反馈放大电路。 8.1 反馈的基本概念 8.1.1 反…

在(Linux)ubuntu下通过GTK调用libvlc开发视频播放器

一、项目介绍 本项目实现了一个基于GTK和libvlc的视频播放器。使用GTK创建GUI界面,使用libvlc播放视频。用户可以通过选择视频文件,然后启动播放器来观看视频。 二、VLC介绍 VLC是一款自由、开放源代码的跨平台媒体播放器,支持播放几乎所有常见的音频和视频格式。最初于20…

STM32管脚模拟协议驱动双路16位DAC芯片TM8211

STM32管脚模拟协议驱动双路16位DAC芯片TM8211 TM8211是一款国产的低成本双路16位DAC驱动芯片&#xff0c;可以应用于普通数模转换领域及音频转换领域等。这里介绍STM32 HAL库驱动TM8211的逻辑,时序和代码。 TM8211的功能特性为&#xff1a; TM8211的内部电路功能框图为&…

一个人最大的愚蠢,就是 “习惯性反驳”

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 每个人都有“反驳的义务”&#xff0c;这是全球顶级咨询公司麦肯锡&#xff0c;对所有员工的行为要求&#xff0c;即对于自己不认同的看法和意见&#xff0c;明确表示出自己的想法并提出反驳。麦肯锡认…

揭秘报表新玩法!标配插件不再单调,手把手教你如何在浏览器中引入柱形图插件。

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 图表作为一款用于可视化数据的工具&#xff0c;可以帮助我们更好的分析和理解数…

【Rust日报】2023-06-10

nt-apiset: 一个用于 WindowsAPI API Set Map文件 的 Rust 解析器 我的bootloader程序项目的下一个构建块已经准备好了&#xff01;Nt-apiset 是用 Rust 编写的用于 Windows10及更高版本的 API Set Map 文件的解析器。 API Set是名称以“ API-”或“ ext-”开头的 PE 可执行文件…

【MySQL】View 视图用法及作用

文章目录 1. 视图概述1.1 为什么使用视图&#xff1f;1.2 视图的理解 2. 创建视图2.1 创建单表视图2.2 创建多表联合视图2.3 基于视图创建视图 3. 查看视图4. 更新视图的数据4.1 一般情况4.2 不可更新的视图 5. 删除视图6. 总结6.1 视图优点6.2 视图缺点 1. 视图概述 1.1 为什么…

STL之优先级队列(堆)的模拟实现与仿函数(8千字长文详解!)

STL之优先级队列&#xff08;堆&#xff09;的模拟实现与仿函数 文章目录 STL之优先级队列&#xff08;堆&#xff09;的模拟实现与仿函数优先级队列的概念priority_queue的接口介绍优先级队列的构造函数 priority_queue模拟实现类成员构造函数向下调整算法——正常实现 push向…

正负10V电压输入±电流输出伺服阀控制器

10V、4~20mA模拟指令输入伺服阀放大器是一种控制元件&#xff0c;用于控制液压系统中的比例阀或伺服阀。它主要由三个部分组成&#xff1a;比例阀或伺服阀、放大器。 比例阀或伺服阀是控制流量或压力的元件&#xff0c;它的输出信号通常是电压或电流。放大器用于将实际值转换为…

微信小程序开发uni-app-8分钟上手开发

本篇文章uni-app微信小程序开发-8分钟上手开发 -首先到微信小程序官网登录/注册微信小程序 微信小程序官网 uni-app 微信小程序 注册微信小程序 这里要注意&#xff1a; 激活邮箱之后&#xff0c;选择主体类型为 “个人类型”&#xff0c;并按要求登记主体信息。主体信息提…