添付ファイル付きのGmailメッセージをkintoneに自動的にアップロードを参考にGmailからメールを取得することができました。
ただし、注意事項の1に記載があるように添付ファイル名に日本語が含まれている場合、文字化けをしてしまいます。
utf-8でないため、文字化けをしているのだと思いますが、文字化けをしないほうほうはないのでしょうか?
もしわかる方がいらっしゃいましたらご教授ください。
/*
* 添付ファイル付のGmailメッセージをkintoneに自動的にアップロード
* Copyright (c) 2018 Cybozu
*
* Licensed under the MIT License
*/
'use strict';
var domain = "ドメイン";
var appId = {アプリID};
var apiToken = "APIトークン";
var appName = "アプリ名";
function replaceCharacters(str) {
return str
.replace(/"/g, "\'")
.replace(//g, "\")
.replace(/\r/g, "\\r")
.replace(/\t/g, "\\t");
}
function uploadAttachment(attachment) {
var blob = attachment.copyBlob();
// Make a POST request with form data.
var formData = {
'file': blob
};
var formHeader = {
'X-Requested-With': 'XMLHttpRequest',
'X-Cybozu-API-Token': apiToken
};
// Because payload is a JavaScript object, it will be interpreted as
// as form data. (No need to specify contentType; it will automatically
// default to either 'application/x-www-form-urlencoded'
// or 'multipart/form-data')
var options = {
'method': 'post',
'headers': formHeader,
'payload': formData
};
return UrlFetchApp.fetch('https://' + domain + '/k/v1/file.json', options);
}
function getGmailMessage() {
// Get all unread threads with the subject in inbox
var threads = GmailApp.search('is:unread');
var records = '[';
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();// Get messages
for (var j = 0; j < messages.length; j++) {
var message = messages[j];
if(message.isUnread()) { // スレッド内の未読メールのみ対象
var attachments = message.getAttachments();
var fileKeys = '';
for (var k = 0; k < attachments.length; k++) {
Logger.log('Message "%s" contains the attachment "%s" (%s bytes)',
message.getSubject(), attachments[k].getName(), attachments[k].getSize());
var fileKey = uploadAttachment(attachments[k]);
if (fileKey !== null) {
fileKeys += fileKey + ',';
}
}
records += Utilities.formatString('{"name": { "value": "%s" }',
replaceCharacters(message.getFrom()));//送信者の名前の取得
records += ',' + Utilities.formatString('"email" : { "value": "%s" }',
replaceCharacters(message.getReplyTo()));//送信者のメールアドレス取得
records += ',' + Utilities.formatString('"subject" : { "value": "%s" }',
replaceCharacters(message.getSubject()));//メール題目の取得
records += ',' + Utilities.formatString('"message" : { "value": "%s" }',
replaceCharacters(message.getPlainBody()));//メッセージの取得
if (fileKeys.length > 0) {
if (fileKeys.match(',$')) {
fileKeys = fileKeys.substring(0, fileKeys.length - 1);
}
records += ',' + Utilities.formatString('"Attachment":{"value":[ %s ]}', fileKeys);//File Keyの設定
}
records += '},';
message.markRead(); // Mark as read
}
}
}
if (records.match(',$')) {
records = records.substring(0, records.length - 1);
}
records += ']';
Logger.log('Response JSON is "%s"', records);
return records;
}
function sendToKintone() {
Logger.log('Function called');
var apps = {
YOUR_APPLICATION1: {
appid: appId,
name: appName,
token: apiToken
}
};
var manager = new KintoneManager.KintoneManager(domain, apps);// ライブラリーの初期化
var records = JSON.parse(getGmailMessage());// JSON形式に変換
if (records.length > 0) { //レコードが存在するときのみ生成
var response = manager.create("YOUR_APPLICATION1", records);//kintone レコードの生成
// ステータスコード
// 成功すれば200になる
var code = response.getResponseCode();
Logger.log('Response code is "%s"', code);
} else {
Logger.log('No record found');
}
}