JustPaste.it

// 流れ
// 1. 記録用Googleスプレッドシート作成、スプレッドシートIDを記録
// 2. GoogleAppsScriptのプロジェクト作成、コード貼り付け、設定欄編集
// 3. プロジェクトのトリガーを設定(main, 分タイマー, 1分) (この時Googleの確認済スクリプトでないと警告が出るが無視)

// 設定欄
var spreadsheetId = ''
var sheetName = 'シート1'
var url = 'http://www.pretty-girl.net/profile.php?id=yuuna'
var email = 'test@example.com'

function main() {
var spreadsheet = SpreadsheetApp.openById(spreadsheetId)
var sheet = spreadsheet.getSheetByName(sheetName)

var html = UrlFetchApp.fetch(url).getContentText().replace(/\s/g, '')
// 配列でWebページに掲載されているスケジュール(受付終了・空以外)を取得 [[日付, 時間帯],]
var schedules = getSchedules(html)

// 配列でシートへ記録済みのスケジュールを取得 [[日付, 時間帯],]
var storedSchedules = sheet.getDataRange().getValues()
// シートで記録の更新・追加を行ったスケジュールの保存用配列(メール送信用) [[日付, 時間帯],]
var updatedSchedules = []

// Webページ掲載のスケジュール(受付終了・空以外)を一つずつ調べる
schedules.forEach(function (value, index) {
// 日付をスプレッドシート形式に変換
var formattedValue = [
new Date(2018, value[0].replace(/.*0?(\d+)月.*/g, '$1')-1, value[0].replace(/.[^\d]*0?(\d+)日.*/g, '$1')).toString(),
value[1]
]

// 同一日付・時間帯の出勤情報が記録済みかどうかを調査
var updateOrNew = true
storedSchedules.forEach(function (v) {
if (v[0] == formattedValue[0] && v[1] == formattedValue[1]) {
updateOrNew = false
}
})
// 未記録の場合のみ処理する
if (updateOrNew) {
// シートに同一日付の記録がある場合、行の追加前に消しておく
if (storedSchedules.map(function (v) { v[0] }).indexOf(formattedValue[0]) >= 0) {
sheet.deleteRow(index+1)
}
sheet.appendRow(value)
updatedSchedules.push(value)
}
})

// 更新・追加があればメール送信
if (updatedSchedules.length > 0) {
Logger.log('Email sent.')
Logger.log(updatedSchedules)
MailApp.sendEmail(email, 'PGアップデート情報', updatedSchedules)
}
}

// 配列でWebページに掲載されているスケジュールを取得
function getSchedules(html) {
var rows = html.replace(/.*<tableclass=\"scheduleTable\">(.*)<\/table>.*/, '$1')
.match(/.*?<\/tr>/g)var schedules = []for (i = 1; i <= 2; i++) { var headers = rows[i*2-2].match(/.*?<\/th>/g).map(function (v) {
return v.replace(/(\d{2}月\d{2}日).*<\/th>/, '$1')
})

rows[i*2-1].match(/.*?<\/td>/g).map(function (v) {
return v.replace(/(.[^<]*)(<br\/>)*<\/td>/, '$1')
}).forEach(function (value, index) {
if (value.match(/\d{2}:\d{2}~\d{2}:\d{2}/)) {
schedules.push([headers[index], value])
}
})
}

return schedules
}